New html styles
authorOlga Brani <olgabrani@grnet.gr>
Wed, 2 May 2012 14:14:18 +0000 (17:14 +0300)
committerOlga Brani <olgabrani@grnet.gr>
Wed, 2 May 2012 14:14:18 +0000 (17:14 +0300)
35 files changed:
.gitignore
snf-astakos-app/astakos/im/static/im/cloudbar/cloudbar.js
snf-astakos-app/astakos/im/static/im/cloudbar/home-icon.png
snf-astakos-app/astakos/im/static/im/css/browser-fixes.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/colorbox.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/dropkick.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/formating.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/forms.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/global.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/css/ie7.css
snf-astakos-app/astakos/im/static/im/css/modules.css [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/images/accounts-logo.png [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/images/black-line.jpg [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/images/pictures/signup_pic.png
snf-astakos-app/astakos/im/static/im/images/porta.png [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/images/question-mark.jpg [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/common.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/html5shiv-printshiv.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/jqModal.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/jquery.colorbox.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/jquery.dropkick-1.0.0.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/os.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/resources_list.js [new file with mode: 0644]
snf-astakos-app/astakos/im/static/im/js/underscore.js [new file with mode: 0644]
snf-astakos-app/astakos/im/templates/im/account_base.html
snf-astakos-app/astakos/im/templates/im/base.html
snf-astakos-app/astakos/im/templates/im/base_two_cols.html
snf-astakos-app/astakos/im/templates/im/feedback.html
snf-astakos-app/astakos/im/templates/im/footer.html
snf-astakos-app/astakos/im/templates/im/form_render.html
snf-astakos-app/astakos/im/templates/im/invitations.html
snf-astakos-app/astakos/im/templates/im/login_base.html
snf-astakos-app/astakos/im/templates/im/profile.html
snf-astakos-app/astakos/im/templates/im/signup.html
snf-astakos-app/astakos/im/views.py

index 97cbc26..7648fd5 100644 (file)
@@ -3,4 +3,6 @@ docs/build
 *.pyc
 *.egg-info
 .DS_Store
+.project
+.pydevproject
 snf-astakos-app/astakos/version.py
index a1f1a34..c936146 100644 (file)
@@ -32,8 +32,8 @@ $(document).ready(function(){
     }
 
     var root = $('body');
-    var bar = $('<div class="servicesbar"></div>');
-    var services = $('<div class="services"></div>');
+    var bar = $('<div class="header"></div>');
+    var services = $('<ul class="services"></ul>');
     var profile = $('<div class="profile"></div>');
     
     var get_services_url = window.GET_SERVICES_URL || window.CLOUDBAR_SERVICES;
@@ -41,6 +41,7 @@ $(document).ready(function(){
     // create services links and set the active class to the current service
     $.getJSON(get_services_url + "?callback=?", function(data) {
             $.each(data, function(i, el){
+            var sli = $("<li>");
             var slink = $("<a>");
             if (el.icon) {
                 slink.append($('<img src="'+cssloc+el.icon+'"/>'));
@@ -50,9 +51,10 @@ $(document).ready(function(){
             }
             slink.attr('href', el.url);
             slink.attr('title', el.name);
-            services.append(slink);
+            sli.append(slink);
+            services.append(sli);
             if (el.id == ACTIVE_MENU) {
-                slink.addClass("active");
+                sli.addClass("active");
             }
         });
       });
@@ -86,7 +88,7 @@ $(document).ready(function(){
     user.append(username);
     user.append(usermenu);
     profile.append(user);
-    bar.append(services).append(profile);
+    bar.append(profile).append(services);
     
 
     root.prepend(bar);
index 2901845..107f213 100644 (file)
Binary files a/snf-astakos-app/astakos/im/static/im/cloudbar/home-icon.png and b/snf-astakos-app/astakos/im/static/im/cloudbar/home-icon.png differ
diff --git a/snf-astakos-app/astakos/im/static/im/css/browser-fixes.css b/snf-astakos-app/astakos/im/static/im/css/browser-fixes.css
new file mode 100644 (file)
index 0000000..806deba
--- /dev/null
@@ -0,0 +1,27 @@
+body                                                                                        { -webkit-text-size-adjust:100%; }\r
+\r
+/* Mozilla */\r
+@-moz-document url-prefix() {\r
+       button::-moz-focus-inner,\r
+       input[type="image"]::-moz-focus-inner,\r
+       input[type="submit"]::-moz-focus-inner,\r
+       input[type="reset"]::-moz-focus-inner,\r
+       input[type="button"]::-moz-focus-inner          { border:0; }\r
+       textarea                                                                        { resize:none; }\r
+}\r
+\r
+/* Webkit */\r
+@media screen and (-webkit-min-device-pixel-ratio:0) {\r
+       button,\r
+       input[type="submit"],\r
+       input[type="reset"],\r
+       input[type="button"]                                            { -webkit-appearance:button; }\r
+       input[type="text"]:focus,\r
+       input[type="password"]:focus,\r
+       textarea:focus                                                          { outline:0 none; }\r
+       textarea                                                                        { resize:none; }\r
+       input[type="checkbox"],\r
+       input[type="radio"]                                                     { vertical-align:-2px; }\r
+       input[type="search"]                                                            { -webkit-appearance:textfield; }\r
+       input[type="search"]::-webkit-search-cancel-button      { -webkit-appearance:none; }\r
+}\r
diff --git a/snf-astakos-app/astakos/im/static/im/css/colorbox.css b/snf-astakos-app/astakos/im/static/im/css/colorbox.css
new file mode 100644 (file)
index 0000000..eb6f6f2
--- /dev/null
@@ -0,0 +1,127 @@
+\r
+#colorbox, #cboxOverlay, #cboxWrapper {\r
+    left: 0;\r
+    overflow: hidden;\r
+    position: absolute;\r
+    top: 0;\r
+    z-index: 9999;\r
+}\r
+#cboxOverlay {\r
+    height: 100%;\r
+    position: fixed;\r
+    width: 100%;\r
+}\r
+#cboxMiddleLeft, #cboxBottomLeft {\r
+    clear: left;\r
+}\r
+#cboxContent {\r
+    position: relative;\r
+}\r
+#cboxLoadedContent {\r
+    overflow: auto;\r
+}\r
+#cboxTitle {\r
+    margin: 0;\r
+}\r
+#cboxLoadingOverlay, #cboxLoadingGraphic {\r
+    height: 100%;\r
+    left: 0;\r
+    position: absolute;\r
+    top: 0;\r
+    width: 100%;\r
+}\r
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow {\r
+    cursor: pointer;\r
+}\r
+.cboxPhoto {\r
+    border: 0 none;\r
+    display: block;\r
+    float: left;\r
+    margin: auto;\r
+}\r
+.cboxIframe {\r
+    border: 0 none;\r
+    display: block;\r
+    height: 100%;\r
+    width: 100%;\r
+}\r
+#cboxOverlay {\r
+    background: none repeat scroll 0 0 #000000;\r
+}\r
+#cboxContent {\r
+    margin-top: 20px;\r
+}\r
+.cboxIframe {\r
+    background: none repeat scroll 0 0 #FFFFFF;\r
+}\r
+#cboxError {\r
+    border: 1px solid #CCCCCC;\r
+    padding: 50px;\r
+}\r
+#cboxLoadedContent {\r
+    background: none repeat scroll 0 0 #FFFFFF;\r
+    border: 5px solid #000000;\r
+}\r
+#cboxTitle {\r
+    color: #CCCCCC;\r
+    left: 0;\r
+    position: absolute;\r
+    top: -20px;\r
+}\r
+#cboxCurrent {\r
+    color: #CCCCCC;\r
+    position: absolute;\r
+    right: 0;\r
+    top: -20px;\r
+}\r
+#cboxSlideshow {\r
+    color: #FFFFFF;\r
+    position: absolute;\r
+    right: 90px;\r
+    top: -20px;\r
+}\r
+#cboxPrevious {\r
+    background: url("../images/colorbox/controls.png") no-repeat scroll left top transparent;\r
+    height: 65px;\r
+    left: 5px;\r
+    margin-top: -32px;\r
+    position: absolute;\r
+    text-indent: -9999px;\r
+    top: 50%;\r
+    width: 28px;\r
+}\r
+#cboxPrevious:hover {\r
+    background-position: left bottom;\r
+}\r
+#cboxNext {\r
+    background: url("../images/colorbox/controls.png") no-repeat scroll right top transparent;\r
+    height: 65px;\r
+    margin-top: -32px;\r
+    position: absolute;\r
+    right: 5px;\r
+    text-indent: -9999px;\r
+    top: 50%;\r
+    width: 28px;\r
+}\r
+#cboxNext:hover {\r
+    background-position: right bottom;\r
+}\r
+#cboxLoadingOverlay {\r
+    background: none repeat scroll 0 0 #000000;\r
+}\r
+#cboxLoadingGraphic {\r
+    background: url("../images/colorbox/loading.gif") no-repeat scroll center center transparent;\r
+}\r
+#cboxClose {\r
+    background: url("../images/colorbox/controls.png") no-repeat scroll center top transparent;\r
+    display: block;\r
+    height: 19px;\r
+    position: absolute;\r
+    right: 5px;\r
+    text-indent: -9999px;\r
+    top: 5px;\r
+    width: 38px;\r
+}\r
+#cboxClose:hover {\r
+    background-position: center bottom;\r
+}
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/css/dropkick.css b/snf-astakos-app/astakos/im/static/im/css/dropkick.css
new file mode 100644 (file)
index 0000000..fabb1e1
--- /dev/null
@@ -0,0 +1,167 @@
+/**
+ * Default DropKick theme
+ *
+ * Feel free to edit the default theme
+ * or even add your own.
+ *
+ * See the readme for themeing help
+ *
+ */
+
+/***** Begin Theme, feel free to edit in here! ******/
+
+/* One container to bind them... */
+.dk_container {
+   font-family: 'Antic', sans-serif;
+  
+  font-weight: normal;
+  line-height: 42px;
+  letter-spacing: 1px;
+  border: 1px solid #808080;
+  height:42px;
+  display: inline-block;
+  margin-bottom: -1px;
+  padding-left:21px;
+  
+  z-index: 2;
+  width:308px;
+}
+  .dk_container:focus {
+    outline: 0;
+  }
+  .dk_container a {
+    cursor: pointer;
+    text-decoration: none;
+    color:#808080;
+        
+  }
+
+/* Opens the dropdown and holds the menu label */
+.dk_toggle {
+  /**
+   * Help: Arrow image not appearing
+   * Try updating this property to your correct dk_arrows.png path
+   */
+   background:url(../images/arrow_02.jpg) no-repeat 276px center;
+  
+}
+  .dk_toggle:hover {
+    
+  }
+  /* Applied when the dropdown is focused */
+  .dk_focus .dk_toggle {
+    
+  }
+  .dk_focus .dk_toggle {
+    
+  }
+
+/* Applied whenever the dropdown is open */
+.dk_open {
+  
+  /**
+   * Help: Dropdown menu is covered by something
+   * Try setting this value higher
+   */
+  z-index: 10;
+}
+  .dk_open .dk_toggle {
+    
+    
+  }
+
+/* The outer container of the options */
+.dk_options {
+  
+}
+  .dk_options a {
+    background-color: #fff;
+    border-bottom: 1px solid #999;
+    padding: 8px 20px;
+  }
+  .dk_options li:last-child a {
+    border-bottom: none;
+  }
+  .dk_options a:hover,
+  .dk_option_current a {
+    
+  }
+
+/* Inner container for options, this is what makes the scrollbar possible. */
+.dk_options_inner  {
+  padding:0;
+  margin:0;  
+  border: 1px solid #808080;
+  border-top:0 none;
+}
+.dk_options_inner li   { list-style:none outside;}
+
+/* Set a max-height on the options inner */
+.dk_options_inner,
+.dk_touch .dk_options {
+  max-height: 250px;
+}
+
+/******  End Theme ******/
+
+/***** Critical to the continued enjoyment of working dropdowns ******/
+
+.dk_container {
+  display: none;
+  position: relative;
+}
+  .dk_container a {
+    outline: 0;
+  }
+
+.dk_toggle {
+  display: -moz-inline-stack;
+  display: inline-block;
+  *display: inline;
+  position: relative;
+  zoom: 1;
+}
+
+.dk_open {
+  position: relative;
+}
+  .dk_open .dk_options {
+    display: block;
+  }
+  .dk_open .dk_label {
+    color: inherit;
+  }
+
+.dk_options {
+  display: none;
+  margin-top: -1px;
+  position: absolute;
+  right: 0;
+  width: 100%;
+}
+  .dk_options a,
+  .dk_options a:link,
+  .dk_options a:visited {
+    display: block;
+  }
+  .dk_options_inner {
+    overflow: auto;
+    position: relative;
+  }
+
+.dk_touch .dk_options {
+  overflow: hidden;
+}
+
+.dk_touch .dk_options_inner {
+  max-height: none;
+  overflow: visible;
+}
+
+.dk_fouc select {
+  position: relative;
+  top: -99999em;
+  visibility: hidden;
+}
+
+/***** End Critical to the continued enjoyment of working dropdowns ******/
diff --git a/snf-astakos-app/astakos/im/static/im/css/formating.css b/snf-astakos-app/astakos/im/static/im/css/formating.css
new file mode 100644 (file)
index 0000000..310b486
--- /dev/null
@@ -0,0 +1,105 @@
+/* http://meyerweb.com/eric/tools/css/reset/ \r
+   v2.0 | 20110126\r
+   License: none (public domain)\r
+*/\r
+html, body, div, span, applet, object, iframe,\r
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,\r
+a, abbr, acronym, address, big, cite, code,\r
+del, dfn, em, img, ins, kbd, q, s, samp,\r
+small, strike, strong, sub, sup, tt, var,\r
+b, u, i, center,\r
+dl, dt, dd, ol, ul, li,\r
+fieldset, form, label, legend,\r
+table, caption, tbody, tfoot, thead, tr, th, td,\r
+article, aside, canvas, details, embed, \r
+figure, figcaption, footer, header, hgroup, \r
+menu, nav, output, ruby, section, summary,\r
+time, mark, audio, video                                               { border:0; margin:0; padding:0; font-size:100%; font:inherit; vertical-align:baseline; }\r
+\r
+/* HTML5 display-role reset for older browsers */\r
+article, aside, details, figcaption, figure, \r
+footer, header, hgroup, menu, nav, section             { display:block; }\r
+\r
+/* defaults -----------------------------------*/\r
+:link, a, a:visited                                                            { color:#F89A1C; text-decoration:none; }\r
+a:hover                                                                                        { outline:0; text-decoration:underline; }\r
+a:focus                                                                                        { outline:0 none; text-decoration:none; }\r
+a:active                                                                               { outline:0; text-decoration:none; }\r
+a img, :link img, :visited img                                 { border:none; }\r
+a span                                                                                 { cursor:pointer; }\r
+abbr[title], dfn[title]                                                        { border-bottom:1px dotted; cursor:help; }\r
+address                                                                                        { font-style:italic; margin:0 0 1.5em 0; }\r
+body                                                                                   { background:white; color:#222; font-family: Antic, Arial, sans-serif; font-size:81.3%; line-height:1.5; text-align:left; letter-spacing:1px; }\r
+code, kbd, pre, samp                                                   { font-family:monospace, sans-serif; }\r
+del                                                                                            { text-decoration:line-through; }\r
+dl                                                                                             { margin:1em 0; }\r
+dl dd                                                                                  { margin-left:1em; }\r
+dt                                                                                             { font-weight:bold; }\r
+em, i                                                                                  { font-style:italic; font-weight:inherit; }\r
+h1, h2, h3, h4, h5, h6                                                 { font-weight:bold; line-height:1.4; margin-bottom:0; }\r
+/* Typographic scale based on 12px body size */\r
+h1                                                                                             { font-size:4em; }\r
+h2                                                                                             { font-size:1.231em; }\r
+h3                                                                                             { font-size:1.154em; }\r
+h4                                                                                             { font-size:1.5em; }\r
+h5                                                                                             { font-size:1.333em; }\r
+h6                                                                                             { font-size:1.167em; }\r
+hr                                                                                             { border:0; border-top:1px solid; display:block; height:1px; margin:1em 0; padding:0; }\r
+img                                                                                            { border:0; vertical-align:middle; }\r
+ins                                                                                            { text-decoration:none; }\r
+p                                                                                              { margin-bottom:1em; }\r
+pre                                                                                            { overflow:auto; line-height:24px; }\r
+strong, b                                                                              { font-weight:bold; font-style:inherit; }\r
+sub, sup                                                                               { font-size:75%; line-height:0; position:relative; vertical-align:baseline; }\r
+sub                                                                                            { bottom:-0.25em; }\r
+sup                                                                                            { top:-0.5em; }\r
+\r
+button, input, select, textarea                                        { font-size:100%; margin:0; vertical-align:baseline; }\r
+button, input                                                                  { line-height:normal; }\r
+button[disabled], input[disabled]                              { cursor:default; }\r
+button,\r
+input[type="image"],\r
+input[type="submit"],\r
+input[type="reset"],\r
+input[type="button"]                                                   { cursor:pointer; overflow:visible; }\r
+input[type="checkbox"],\r
+input[type="radio"]                                                            { box-sizing:border-box; padding:0; }\r
+legend                                                                                 { border:0; white-space:normal; }\r
+optgroup                                                                               { font-style:normal; font-weight:bold; }\r
+textarea                                                                               { overflow:auto; vertical-align:top; }\r
+\r
+q                                                                                              { quotes:"‘" "’" "“" "”"; } /* http://html5doctor.com/blockquote-q-cite/ */\r
+q:before                                                                               { content:"‘"; content:open-quote; }\r
+q:after                                                                                        { content:"’"; content:close-quote; }\r
+q q:before                                                                             { content: "“"; content: open-quote; }\r
+q q:after                                                                              { content: "”"; content: close-quote; }\r
+blockquote                                                                             { quotes: "“" "”"; margin:1em 40px; }\r
+blockquote p:before                                                            { content: "“"; content: open-quote; }\r
+blockquote p:after                                                             { content: ""; content: no-close-quote; }\r
+blockquote p:last-of-type:after                                        { content: "”"; content: close-quote; }\r
+blockquote                                                                             { font-style:italic; margin:1em; }\r
+\r
+caption                                                                                        { font-weight:bold; text-align:left; margin-bottom:.2em; padding:0; }\r
+table                                                                                  { border-collapse:collapse; border-spacing:0; margin-bottom:1em; }\r
+tfoot                                                                                  { font-style:italic; }\r
+thead td, th                                                                   { font-weight:bold; vertical-align:top; }\r
+\r
+ol                                                                                             { list-style-type:decimal; margin:1em 0; padding-left:2em; }\r
+ol li                                                                                  { list-style:decimal outside; }\r
+ol ol li                                                                               { list-style-type:lower-alpha; }\r
+ol ol ol li                                                                            { list-style-type:lower-roman; }\r
+\r
+ul                                                                                             { list-style-type:disc; margin:1em 0; padding-left:2em; }\r
+ul li                                                                                  { list-style:disc outside; }\r
+ul ul li                                                                               { list-style-type:circle; }\r
+ul ul ul li                                                                            { list-style-type:square; }\r
+\r
+/* helpers ------------------------------------*/\r
+.clearfix:before,\r
+.clearfix:after                                                                        { content:" "; display:block; height:0; visibility:hidden; } /* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified/ */\r
+.clearfix:after                                                                        { clear:both; }\r
+.visuallyhidden                                                                        { position:absolute !important; clip:rect(0 0 0 0); }\r
+\r
+/* misc ---------------------------------------*/\r
+img[align="left"]                                                              { margin:0 1em 0.5em 0; }\r
+img[align="right"]                                                             { margin:0 0 0.5em 1em; }\r
diff --git a/snf-astakos-app/astakos/im/static/im/css/forms.css b/snf-astakos-app/astakos/im/static/im/css/forms.css
new file mode 100644 (file)
index 0000000..5b1adc3
--- /dev/null
@@ -0,0 +1,308 @@
+/* generic form styles */\r
+input, textarea, .form-widget {\r
+  background-color: #ffffff;\r
+  color: #000;\r
+  border-color: #000000;\r
+}\r
+#forms .input, #forms input {\r
+  font-family: 'Antic', sans-serif;\r
+  font-size: 14px;\r
+  font-weight: normal;\r
+  line-height: 22px;\r
+  letter-spacing: 1px;\r
+  border: 1px solid #808080;\r
+  height: 21px;\r
+  display: inline-block;\r
+  margin-bottom: -1px;\r
+  padding: 0.8em;\r
+  padding-left: 1.5em;\r
+  z-index: 2;\r
+}\r
+#forms .input:focus, #forms input:focus {\r
+  position: relative;\r
+  border: 1px solid #000;\r
+  z-index: 100;\r
+}\r
+#forms .input:focus label, #forms input:focus label {\r
+  z-index: 300;\r
+}\r
+.altcol {\r
+  background-color: #c3c3b9 !important;\r
+}\r
+.altcol:hover {\r
+  background-color: #f89a1c !important;\r
+}\r
+\r
+form.withlabels label {\r
+  width: 224px;\r
+  display: block;\r
+  float: left;\r
+  padding-top: 1em;\r
+}\r
+form.withlabels input[type=text], form.withlabels input[type=password] {\r
+  width: 224px;\r
+}\r
+form.withlabels input[type=text].long, form.withlabels input[type=password].long, form.withlabels textarea.long {\r
+  width: 224px;\r
+}\r
+.login-section a.button {\r
+  margin-bottom: 12px;\r
+}\r
+.login-section a.button:last-child {\r
+  margin-bottom: none;\r
+}\r
+.login-section a.button.withicon {\r
+  background-repeat: no-repeat;\r
+  background-position: 15px 50%;\r
+  padding-left: 40px;\r
+}\r
+.login-section.loggedin {\r
+  padding-bottom: 0 !important;\r
+  background-image: none !important;\r
+}\r
+form.login {\r
+  margin-bottom: 22px;\r
+  width:340px;\r
+}\r
+\r
+form h2 span {\r
+  padding-bottom: 3px;\r
+}\r
+form .form-row {\r
+  min-height: 29.333333333333332px;\r
+  position: relative;\r
+}\r
+form .form-row.submit {\r
+  margin: 22px 0 ;\r
+}\r
+form .form-row .extra-link {\r
+  color: #808080;\r
+  text-decoration: none;\r
+  border: none;\r
\r
+ line-height:42px;\r
+  float: right;\r
+}\r
+form .form-row .extra-link:hover       { text-decoration:underline;}\r
+form .form-row label {\r
+  font-size: 1.1em;\r
+}\r
+form.innerlabels label {\r
+  position: absolute;\r
+  top: 1.1em;\r
+  left: 1.5em;\r
+  color: #808080 ;\r
+}\r
+form.innerlabels p {\r
+  margin:0;\r
+  position: relative;\r
+}\r
+form.innerlabels p.p15px       { font-size:1.154em;}\r
+form.innerlabels p.p15px a     { margin:0 5px;}\r
+form.innerlabels p.p15px a:hover       { text-decoration:underline;}\r
+form.innerlabels a,\r
+form.innerlabels a:hover { border:0 none;}\r
+form textarea,\r
+form input.text,\r
+form input[type="text"],\r
+form input[type="password"]  {\r
+  color:#808080; \r
+  font-family: 'Antic', sans-serif;\r
+  font-weight: normal;\r
+  line-height: 22px;\r
+  letter-spacing: 1px;\r
+  border: 1px solid #808080;\r
+  height: 21px;\r
+  display: inline-block;\r
+  margin-bottom: -1px;\r
+  padding: 0.8em;\r
+  padding-left: 1.5em;\r
+  z-index: 2;\r
+  width:300px;\r
+}\r
+\r
+form select    {\r
+       font-family: 'Antic', sans-serif;\r
+  font-weight: normal;\r
+  line-height: 22px;\r
+  letter-spacing: 1px;\r
+  border: 1px solid #808080;\r
+  display:block;\r
+  margin-bottom: -1px;\r
+  padding: 0.8em;\r
+  padding-left: 1.5em;\r
+  z-index: 2;\r
+  width:331px;\r
+}\r
+form textarea:focus,\r
+form input.text:focus,\r
+form input[type="text"]:focus,\r
+form input[type="password"]:focus {\r
+  position: relative;\r
+  border: 1px solid #000;\r
+  z-index: 100;\r
+}\r
+form textarea:focus label,\r
+form input.text:focus label,\r
+form input[type="text"]:focus label,\r
+form input[type="password"]:focus label {\r
+  z-index: 300;\r
+}\r
+form input.submit, form input[type="submit"] {\r
+  font-family: 'Antic', sans-serif;\r
+  font-size: 14px;\r
+  font-weight: normal;\r
+  line-height: 22px;\r
+  letter-spacing:1px;\r
+  background-color: #3582ac;\r
+  color: #ffffff;\r
+  border: none;\r
+  padding: 10px 22px;\r
+  font-size: 1em;\r
+  \r
+}\r
+form input.submit:hover, form input[type="submit"]:hover {\r
+  background-color: #f89a1c;\r
+}\r
+form input.submit.back, form input[type="submit"].back {\r
+  text-decoration: none;\r
+  bottom: 0;\r
+  float: right;\r
+  z-index: 500;\r
+}\r
+form input.submit.back.right, form input[type="submit"].back.right {\r
+  right: 0;\r
+}\r
+form input.submit:hover, form input[type="submit"]:hover {\r
+  background-color: #f89a1c;\r
+}\r
+form input.submit.back, form input[type="submit"].back {\r
+  text-decoration: none;\r
+  bottom: 0;\r
+  float: right;\r
+  z-index: 500;\r
+}\r
+form input.submit.back.right, form input[type="submit"].back.right {\r
+  right: 0;\r
+}\r
+form textarea {\r
+  height: 150px;\r
+  width: 350px; \r
+  max-height:150px;\r
+  max-width:350px;\r
+}\r
+form .with-errors input, form .with-errors textarea, form .with-errors select {\r
+  color: #9d261d;\r
+}\r
+form .with-errors label {\r
+  color: #e4776f;\r
+}\r
+.form-error {\r
+  background-color: #9d261d;\r
+  color: #fff;\r
+  font-size: 0.8em;\r
+  padding: 5px 5px;\r
+}\r
+.form-errors.all .form-error {\r
+  position: relative;\r
+  border-radius: 0;\r
+  margin-bottom: 1.3em;\r
+  padding: 0.5em;\r
+}\r
+div.form-stacked {\r
+  margin-bottom: 4em;\r
+}\r
+\r
+.checkbox-widget.checked {\r
+    background-color: #FF0000;\r
+    background-image: url("../images/checkbox.png");\r
+    background-position: 50% 50%;\r
+}\r
+.checkbox-widget {\r
+    border: 1px solid #808080;\r
+    cursor: pointer;\r
+    display: block;\r
+    float: left;\r
+    height: 25px;\r
+    margin:5px 20px 0 0 ;\r
+    width: 25px;\r
+   \r
+}\r
+\r
+\r
+form.withlabels .checkbox-widget{\r
+       margin-top:20px;        \r
+}\r
+\r
+form.innerlabels .checkbox-widget +  label     {\r
+       position:static;\r
+       line-height:36px;\r
+       color:#808080;\r
+       \r
+}\r
+\r
+form.innerlabels .checkbox-widget +  label + a {\r
+       border-bottom:1px solid #F89A1C;\r
+       font-size: 1.1em;\r
+       \r
+}\r
+\r
+form span.info{\r
+    position:absolute;\r
+    z-index:10; \r
+    top:8px; \r
+    left: 260px;\r
+   \r
+}\r
+form span.info em {\r
+    display:block; \r
+    overflow:hidden;\r
+    position:absolute;\r
+    left:0; \r
+    text-indent:-100px;\r
+    top:0; \r
+    height:28px;\r
+    width:28px;\r
+    background:url(../images/question-mark.jpg) no-repeat left bottom;\r
+    cursor:pointer;       \r
+}\r
+\r
+form span.info:hover em {\r
+    background-position:left top;\r
+}\r
+\r
+form span.info span  {\r
+    position:relative; \r
+    left:42px;\r
+    top:2px;\r
+    width:150px;\r
+    padding-left:55px; \r
+    background:url(../images/black-line.jpg ) no-repeat left 12px;\r
+    min-height:50px;\r
+    display:none;\r
+    color:#b3b3b3;\r
+}\r
+\r
+form span.info span  a {\r
+       color:#b3b3b3;\r
+       border-bottom:1px solid #F89A1C;        \r
+}\r
+\r
+form span.info:hover span {\r
+    display:block;\r
+}\r
+\r
+form p {\r
+       margin-bottom:0;\r
+}\r
+\r
+\r
+form input[readonly=true] {\r
+  background-color: #ddd;\r
+  color: #5e5e5e;\r
+}\r
+\r
+#recaptcha_area {\r
+       margin-top:20px;\r
+}\r
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/css/global.css b/snf-astakos-app/astakos/im/static/im/css/global.css
new file mode 100644 (file)
index 0000000..709ac42
--- /dev/null
@@ -0,0 +1,6 @@
+@import url(formating.css);\r
+@import url(modules.css);\r
+@import url(colorbox.css);\r
+@import url(browser-fixes.css);\r
+@import url(forms.css);\r
+@import url(dropkick.css);
\ No newline at end of file
index d9f8201..f406a35 100644 (file)
@@ -1,13 +1,11 @@
-.navigation {
-    min-width: 660px;
-}
-
-.mainnav.inline {
-    position: absolute;
-    right: -10px;
-}
-
-.mainnav.inline.subnav {
-    position: relative;
-    top: 50px;
-}
+button, input, select, textarea                                     { vertical-align:middle; }\r
+input[type="button"], input[type="submit"]             { overflow:visible; }\r
+input[type="checkbox"],\r
+input[type="radio"]                                                            { width:13px; height:13px; }\r
+legend                                                                                 { margin-left:-7px; }\r
+textarea                                                                               { overflow:auto; }\r
+img                                                                                            { -ms-interpolation-mode:bicubic; }\r
+\r
+.clearfix                                                                              { zoom:1; }\r
+.container .navigation ul li                                           { display:inline;}\r
+.lt .box-more ul.col                                                           { display:inline;}
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/css/modules.css b/snf-astakos-app/astakos/im/static/im/css/modules.css
new file mode 100644 (file)
index 0000000..53104d3
--- /dev/null
@@ -0,0 +1,191 @@
+.wrapper                                        { margin:0 auto; position:relative; width:820px; padding:36px 70px; }\r
+.container .wrapper,\r
+.footer .wrapper                                { border: 1px solid #808080; border-top:0 none;}\r
+.centered                                       { text-align:center;}\r
+img.left                                                               { margin:0 1em 1em 0; float:left;}\r
+img.right                                                              { margin:0 0 1em 1em; float:right;}\r
+\r
+\r
+/* header */\r
+.header                                         { background:#000; color:#fff;  height:35px; line-height:35px; }       \r
+.header .wrapper                                { width:auto; padding:0;}                      \r
+.header a                                       { color:#fff; text-decoration:none;}\r
+.header .profile                                { float:right; background:#01A1AE; width:150px; padding:0 20px; text-align:right;  }\r
+.header .profile a                              { text-decoration:none; color:#fff; }\r
+.header .profile ul                             { position:absolute; right:0; top:35px; padding:0; margin:0; background:#01A1AE; width:190px; display:none;    }\r
+.header .profile ul li                          { list-style:none outside; line-height:35px; border-top:1px solid #000; padding:0 20px;}\r
+.header .profile ul li:hover                                   { background:#000;}\r
+.header .profile:hover ul                       { display:block; }\r
+.header ul.services                             { margin:0; padding:0; }\r
+.header ul.services li                          { float:left; height:35px; line-height:35px; text-align:center; padding: 0 30px; list-style:none outside;}\r
+.header ul.services li:first-child              { padding:0 5px;}\r
+.header ul.services li.active                   { background:#333;}\r
+.header ul.services li:hover                    { background:#444; }\r
+\r
+\r
+/* footer */\r
+.footer                                         { font-size:0.923em;color:#B3B3B3; }\r
+.footer a                                       { color:#B3B3B3; text-decoration:none; transition:color 0.15s ease-in-out 0s; -moz-transition: color 0.15s ease-in-out 0s;  -webkit-transition: color 0.15s ease-in-out 0s;  -o-transition: color 0.15s ease-in-out 0s; } \r
+.footer:hover a                                 { color:#808080;}\r
+.footer a:hover                                 { color:#000;}\r
+.footer ul                                      { float:left; margin:0 0 0 22px; width:140px;  padding:0;}\r
+.footer ul li                                   { padding:0; margin:0 0 0.5em 0; list-style:none outside;}\r
+.footer ul li:first-child                       { margin-bottom:1em;   }\r
+.footer .clearfix                               { padding-bottom:20px;}\r
+.footer .clearfix ul:first-child                { margin-left:0;}\r
+\r
+\r
+/*top message*/\r
+.top-msg                                           { margin:-36px -70px 40px; background:blue; padding:100px 200px; color:#fff; display:none; position:relative;}\r
+.top-msg  p                                        { font-size:1.5em;}\r
+.top-msg  p.title                                  { font-size:2em;  }\r
+.top-msg  p.title span                         { border-bottom:2px dotted #fff; padding:0 0 10px 0;}\r
+.top-msg.active                                { display:block;}\r
+.active+h1                                         { display:none;}\r
+.top-msg .close                                 { position:absolute; bottom:20px; right:20px; font-size:2em; font-weight:bold; border:0 none; color:#fff; text-decoration:none;}\r
+\r
+/* container */\r
+.container h1                                                                  { margin:0; line-height:100%;}\r
+.container .wrapper                             { padding-bottom:100px;}\r
+.container .navigation                          { margin:20px 0 40px; font-size:1.231em;}\r
+.container .navigation ul                       { margin:5px 0; padding:0;}\r
+.container .navigation ul li                    { list-style:none outside; padding:0; margin:0 0 0 1em; display:inline-block;}\r
+.container .navigation ul li:first-child        { margin-left:0;}\r
+.container .navigation ul li a                  { color:#000; text-decoration:none; }\r
+.container .navigation ul li a:hover            { border-bottom:1px solid #F89A1C;}    \r
+.container .navigation ul li.active a           { color:#F89A1C; }                                     \r
+.dotted                                         { background:url(../images/double-dots.jpg) no-repeat bottom center; padding:30px 0; margin-bottom:30px;}\r
+.two-cols .rt                                   { float:right; width:390px;}\r
+.two-cols .lt                                   { float:left; width:390px;}\r
+.two-cols .lt p                                 { padding-right:40px;}\r
+.two-cols-lt580 .rt                             { float:right; width:200px; margin-left:40px;}\r
+.two-cols-lt580 .lt                             { overflow:hidden;}\r
+.container h2, .container h3                    { font-weight:normal; margin-bottom:1em; }\r
+.container h2 em                                                               { color: #3582AC; font-style:normal; }\r
+.content a                                                             { border-bottom: 1px solid #F89A1C; text-decoration:none; color:#000; }\r
+.content a:hover                                                   { border-bottom: 1px solid #F89A1C; text-decoration:none; color:#F89A1C; }\r
+.container ul.options                           { font-size:1.231em; padding:0; margin:0;}\r
+.container ul.options li                        { list-style:none outside; margin:0 0 1em 0;padding:0;}\r
+.container ul.options li a                                     { border:0 none;}\r
+.container ul.options li a:hover                               { text-decoration:underline;}\r
+.landing h2, .landing a:hover                   { color:#01A1AE;}\r
+.faq h2, .faq a:hover                           { color:#EF4F54; border:0 none;}\r
+.faq ul                                         { padding:0; margin:0; }\r
+.faq ul li                                      { list-style:none outside; padding:0 0 0 5px; margin:0;  }\r
+.faq ul li a                                    { color:#222222; border:0 none;} \r
+.follow h3 a                                    { color:#4085A6;}\r
+.follow a                                                      { border:0 none;}\r
+.follow ul                                      { margin:0; padding:0;}\r
+.follow ul li                                   { list-style:none outside; padding:0; margin:0 0 20px 0; font-size:0.923em; color:#808080;}\r
+.follow ul li p.title                           { margin-bottom:0; color:#000;}\r
+.follow ul li p.title a                         { color:#000;}\r
+.follow ul li p a                               { color:#808080;}\r
+.posts ul                                       { margin:0;padding:0; }\r
+.posts ul li                                    { padding:0; margin:0 0 50px; list-style:none outside; }\r
+.posts ul li .img-div                           { float:left; width:160px; margin-right:20px; }\r
+.posts ul li .img-div img                       { max-width:160px;}\r
+.posts ul li .img-div p                         { font-size:1.154em; color:#01A1AE;}\r
+.posts ul li .txt                               { overflow:hidden;} \r
+.posts ul li .txt h3                            { color:#F89A1C;}\r
+.posts ul li .txt h3 a                          { color:#F89A1C; border:0 none; }\r
+.posts ul li p.info                             { background:url(../images/blog-dots.jpg) no-repeat top; padding-top:10px; margin-top:20px; font-size:0.923em; color:#808080;}\r
+.article p.info                                                                { margin-top:20px; padding-top:10px; font-size:0.923em; color:#808080; border-top:1px dashed #ccc;}\r
+p.info a                                        { color:#808080; }\r
+.bg-wrap                                        { background-position:right top; background-repeat:no-repeat;}\r
+.bg-wrap .extra                                 { display:none;}\r
+.bg-wrap.open .extra                            { display:block;}\r
+.bg-wrap .extra .hide-extra                     { display:block; text-align:right; border:0 none; height:16px; overflow:hidden;}\r
+.bg-wrap .extra .hide-extra img                 { margin-top:0; vertical-align:top; display:inline; }\r
+.bg-wrap .extra .hide-extra:hover img           { margin-top:-16px;}\r
+.cyclades .bg-wrap .extra .hide-extra:hover img { margin-top:-32px;}\r
+.pithos h2, .pithos a:hover,                     \r
+.pithos .extra .options li                      { color:#F89A1C; }\r
+.cyclades h2, .cyclades a:hover,                     \r
+.cyclades .extra .options li                    { color:#4085A6; }\r
+.cyclades a                                                                { border-bottom:1px solid #4085A6; }\r
+.cyclades a:hover                                                          { border-bottom:1px solid #4085A6; }\r
+a.btn_01                                        { display:block; text-align:center; background:#F6921E; color:#000; padding:10px; text-decoration:none; border:0 none;}\r
+a.btn_01:hover                                  { background:#01A1AE; color:#000; border:0 none;}\r
+a.btn_01 em                                     { font-style:normal; display:block; }\r
+a.btn_01 span                                   { color:#fff; }\r
+.lt .box-more                                   { text-align:center; padding:5px 10px; }\r
+.lt .box-more.border                            { border:1px solid #ccc;}\r
+.lt .box-more p                                 { cursor:pointer; background:url(../images/arrow_02.jpg) no-repeat right center; padding-right:20px; }\r
+a.btn_01, .box-more                             { width:80%; margin:0 auto 20px; }\r
+.lt .box-more ul.col                            { width:30%; margin:0; padding:0; vertical-align:top; text-align:left; display:inline-block;}\r
+.lt .box-more .clearfix                         { display:none; }\r
+.lt .box-more ul.col li                         { list-style:none outside; }\r
+.lt .box-more ul.col li a                       { color:#B3B3B3; text-decoration:none; border:0 none;}\r
+.lt .box-more ul.col li a:hover                 { color:#000;}\r
+.article img                                                       { margin-bottom:1em; max-width:100%;}\r
+a.videolink                                                        { border: 0 none; display:block; width:367px; height:207px; background:url(../images/video_image_hover.png) no-repeat; text-decoration:none;}\r
+a.videolink:hover                                              { background:url(../images/video_image.png)no-repeat; text-decoration:none; border:0 none;}\r
+.container .full                                                               { position:relative;}\r
+\r
+\r
+\r
+/* resources*/\r
+.resources .categories .clear                  { color: #000000; float: right; margin-right: 4px;}\r
+.resources  a, .resources  a:hover              { border:0 none;}\r
+.resources .categories ul                          { margin:0;padding:0;}\r
+.resources .categories ul li                    { float: left; list-style:none outside;}\r
+.resources .categories .title                   { margin-bottom: 0.5em; }\r
+.resources .categories ul li a                  { color: #000000;   margin-right: 22px; text-decoration: none; }\r
+.resources .categories ul li a:hover, \r
+.resources .categories ul li a.selected         { color: #000000 }\r
+.resources .categories ul li.inactive           { opacity: 0.3; }\r
+.resources .categories ul li.active             { font-weight: bold; opacity: 1; }\r
+.resources .list                                { line-height: 1em; margin-top: 60px; position: relative; width:855px; }\r
+.resources .list .resource-wrapper.first .resource      { margin-left: 0; }\r
+.resources .list .resource-wrapper              { float: left; height: 250px; margin-bottom: 22px; margin-right: 35px; overflow: hidden; position: relative; width: 250px; }\r
+.resources .list .resource-wrapper.first        { margin-left: 0; }\r
+.resources .list .resource-wrapper.hidden       { display: none; }\r
+.resources .list .resource                      { border: 1px solid #000000; height: 188px; overflow: hidden; padding: 30px; }\r
+.resources .list .resource .date                { color: #808080; margin-bottom: 3px; }\r
+.resources .list .resource .description         { transition:color top 0.35s ease-in-out 0s; -moz-transition: top 0.35s ease-in-out 0s; -webkit-transition: top 0.35s ease-in-out 0s;          -o-transition: top 0.35s ease-in-out 0s; color: #FFFFFF; font-size: 1.1em; height: 150px; margin-left: -30px; padding: 30px; position: absolute; top: -270px; width: 190px; }\r
+.resources .list .resource .title               { line-height: 1.4em; }\r
+.resources .list .resource .category            { color: #808080; margin-top: 30px; }\r
+.resources .list .resource .category a          { color: #808080; }\r
+.resources .list .resource .download            { bottom: 0; cursor: pointer; font-size: 1.1em; margin-bottom: 3px; margin-left: -10px; position: absolute; width: 190px; }\r
+.resources .list .resource .download a          { color: #000000; display: block; padding: 5px 5px 5px 15px; text-decoration: none; }\r
+.resources .list .resource .download a:hover, \r
+.resources .list .resource .download a .hovered { color: #FF5D00;}\r
+.resources .list .resource .download a:hover .download-image, \r
+.resources .list .resource .download a .hovered .download-image { background-image: url(../images/resource_down_arrow-active.png); }\r
+.resources .list .resource .download a .download-image { background: url(../images/resource_down_arrow.png) no-repeat; display: block; float: left; height: 30px; margin-right: 10px; margin-top: -7px; width: 30px; }\r
+.resources .list .resource .download img        { margin-right: 10px; vertical-align: middle;}\r
+.resources .list .resource:hover .description, \r
+.resources .list .resource .hover .description { display: block; top: 0; }\r
+.resources .list .resource-cat-1.resource               { border-color: #4085A5  }\r
+.resources .list .resource-cat-1.resource .title        { color: #4085A5 }\r
+.resources .list .resource-cat-1.resource .description  { background-color: #4085A5 }\r
+.resources   .resource-cat-1.filter-item a              { color: #4085A5  }\r
+.resources .list .resource-cat-2.resource               { border-color: #FF6F00  }\r
+.resources .list .resource-cat-2.resource .title        { color: #FF6F00  }\r
+.resources .list .resource-cat-2.resource .description  { background-color: #FF6F00  }\r
+.resources  .resource-cat-2.filter-item a               { color: #FF6F00  }\r
+\r
+table                                                                                  { width:100%;}\r
+table th, table td                                                             { padding:10px;  }\r
+table td                                                                               { border-top: 1px solid #DDDDDD; }\r
+table td.consumed                                                              { color: #9D261D; }\r
+\r
+.zebra-striped tbody tr:nth-child(2n+1) td, \r
+.zebra-striped tbody tr:nth-child(2n+1) th             { background-color: #F9F9F9; }\r
+.zebra-striped tbody tr:hover td, \r
+.zebra-striped tbody tr:hover th                               { background-color: #F5F5F5; }\r
+\r
+.buttons-list.fixpos                                                   { position:absolute; bottom:0; right:0; }\r
+.button.back.right                                                             { right: 0; }\r
+.buttons-list .button                                                  { margin-left: 10px; }\r
+.button.back                                                                   {  z-index: 500; }\r
+a.button                                                                               { border:0 none;  color: #FFFFFF;  display: block;  text-align: center; background-color: #3582AC; letter-spacing: 1px;  line-height: 22px; padding: 0.8em 22px; text-decoration: none;}\r
+a.button:hover                                                                 { background-color: #F89A1C; border:0 none; color:#fff;}\r
+\r
+/*pagination*/\r
+.pagination a                                   { border:0 none;}\r
+.pagination .next-prev                          { float:left; }\r
+.pagination .nums                               { text-align:right;}\r
+.pagination .nums span                          { color:#F89A1C;}\r
+                    \r
+\r
diff --git a/snf-astakos-app/astakos/im/static/im/images/accounts-logo.png b/snf-astakos-app/astakos/im/static/im/images/accounts-logo.png
new file mode 100644 (file)
index 0000000..765058c
Binary files /dev/null and b/snf-astakos-app/astakos/im/static/im/images/accounts-logo.png differ
diff --git a/snf-astakos-app/astakos/im/static/im/images/black-line.jpg b/snf-astakos-app/astakos/im/static/im/images/black-line.jpg
new file mode 100644 (file)
index 0000000..fc27f69
Binary files /dev/null and b/snf-astakos-app/astakos/im/static/im/images/black-line.jpg differ
index 617e72a..b1b2627 100644 (file)
Binary files a/snf-astakos-app/astakos/im/static/im/images/pictures/signup_pic.png and b/snf-astakos-app/astakos/im/static/im/images/pictures/signup_pic.png differ
diff --git a/snf-astakos-app/astakos/im/static/im/images/porta.png b/snf-astakos-app/astakos/im/static/im/images/porta.png
new file mode 100644 (file)
index 0000000..50947a6
Binary files /dev/null and b/snf-astakos-app/astakos/im/static/im/images/porta.png differ
diff --git a/snf-astakos-app/astakos/im/static/im/images/question-mark.jpg b/snf-astakos-app/astakos/im/static/im/images/question-mark.jpg
new file mode 100644 (file)
index 0000000..6096ffc
Binary files /dev/null and b/snf-astakos-app/astakos/im/static/im/images/question-mark.jpg differ
diff --git a/snf-astakos-app/astakos/im/static/im/js/common.js b/snf-astakos-app/astakos/im/static/im/js/common.js
new file mode 100644 (file)
index 0000000..d0e6174
--- /dev/null
@@ -0,0 +1,76 @@
+function setContainerMinHeight(){\r
+\r
+    var h = $('.header').height();\r
+    var f = $('.footer').height();\r
+    var w = $(window).height();\r
+    var pTop = parseInt (($('.container .wrapper').css('padding-top').replace("px", "")) );\r
+    var pBottom = parseInt (($('.container .wrapper').css('padding-bottom').replace("px", "")));\r
+\r
+    var c = w - ( h+f+pTop+pBottom);\r
+    $('.container .wrapper').css('min-height', c);\r
+    \r
+\r
+}\r
+\r
+$(document).ready(function() {\r
+\r
+       setContainerMinHeight();\r
+       \r
+    $('.show-extra').click(function(e) {\r
+        e.preventDefault();\r
+        \r
+        $(this).parents('.bg-wrap').find('.extra').toggle('slow');\r
+        $('.hide-extra').toggle();    \r
+    });\r
+    $('.hide-extra').click(function(e) {\r
+        e.preventDefault();\r
+        $(this).hide();\r
+        $(this).parents('.bg-wrap').find('.extra').hide('slow');\r
+    });\r
+    \r
+    $('.box-more p').click(function(e) {\r
+        $(this).siblings('.clearfix').toggle('slow');\r
+        $(this).parents('.box-more').toggleClass('border');\r
+    });\r
+       \r
+               \r
+       $('.top-msg a.close').click(function(e) {\r
+        e.preventDefault();\r
+        $(this).parents('.top-msg').slideUp('5000', function() {\r
+             $('.top-msg').removeClass('active')\r
+        });\r
+    });\r
+    \r
+    //$('select').dropkick();\r
+    \r
+  \r
+    if ( $('#os').length > 0 ) {\r
+       var os = BrowserDetect.OS;\r
+       if ( os!=="an unknown OS" ) {\r
+           $('#os').html('version '+os);\r
+        }\r
+    }\r
+    \r
+    $('.top-msg .success').parents('.top-msg').css(\r
+       {\r
+               backgroundColor: '#f3c',\r
+               color: '#fff'\r
+       }\r
+    )\r
+    \r
+    $('.top-msg .error').parents('.top-msg').css(\r
+       {\r
+               backgroundColor: 'red',\r
+               color: '#fff'\r
+       }\r
+    )\r
+    \r
+    \r
+    $('.top-msg .warning').parents('.top-msg').css(\r
+       {\r
+               backgroundColor: '#90f',\r
+               color: '#fff'\r
+       }\r
+    )\r
+    \r
+});\r
diff --git a/snf-astakos-app/astakos/im/static/im/js/html5shiv-printshiv.js b/snf-astakos-app/astakos/im/static/im/js/html5shiv-printshiv.js
new file mode 100644 (file)
index 0000000..67db706
--- /dev/null
@@ -0,0 +1,267 @@
+/*! HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed */\r
+(function (win, doc) {\r
+       // feature detection: whether the browser supports unknown elements\r
+       var supportsUnknownElements = (function (a) {\r
+               a.innerHTML = '<x-element></x-element>';\r
+               return a.childNodes.length === 1;\r
+       })(doc.createElement('a'));\r
+\r
+       // feature detection: whether the browser supports default html5 styles\r
+       var supportsHtml5Styles = (function (nav, docEl, compStyle) {\r
+               docEl.appendChild(nav);\r
+               return (compStyle = (compStyle ? compStyle(nav) : nav.currentStyle).display) && docEl.removeChild(nav) && compStyle === 'block';\r
+       })(doc.createElement('nav'), doc.documentElement, win.getComputedStyle);\r
+\r
+       // html5 global so that more elements can be shived and also so that existing shiving can be detected on iframes\r
+       // more elements can be added and shived with the following code: html5.elements.push('element-name'); shivDocument(document);\r
+       var html5 = {\r
+               // a list of html5 elements\r
+               elements: 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '),\r
+\r
+               // the shiv function\r
+               shivDocument: function (scopeDocument) {\r
+                       scopeDocument = scopeDocument || doc;\r
+\r
+                       // test if the document has already been shived\r
+                       if (scopeDocument.documentShived) {\r
+                               return;\r
+                       }\r
+                       scopeDocument.documentShived = true;\r
+\r
+                       // set local variables\r
+                       var\r
+                       documentCreateElement = scopeDocument.createElement,\r
+                       documentCreateDocumentFragment = scopeDocument.createDocumentFragment,\r
+                       documentHead = scopeDocument.getElementsByTagName('head')[0],\r
+                       documentCreateElementReplaceFunction = function (m) {\r
+                               documentCreateElement(m);\r
+                       };\r
+\r
+                       // shiv for unknown elements\r
+                       if (!supportsUnknownElements) {\r
+                               // shiv the document\r
+                               html5.elements.join(' ').replace(/\w+/g, documentCreateElementReplaceFunction);\r
+\r
+                               // shiv document create element function\r
+                               scopeDocument.createElement = function (nodeName) {\r
+                                       var element = documentCreateElement(nodeName);\r
+                                       if (element.canHaveChildren){\r
+                                               html5.shivDocument(element.document);\r
+                                       } \r
+                                       return element;\r
+                               };\r
+\r
+                               // shiv document create element function\r
+                               scopeDocument.createDocumentFragment = function () {\r
+                                       return html5.shivDocument(documentCreateDocumentFragment());\r
+                               };\r
+                       }\r
+\r
+                       // shiv for default html5 styles\r
+                       if (!supportsHtml5Styles && documentHead) {\r
+                               var div = documentCreateElement('div');\r
+                               div.innerHTML = ['x<style>',\r
+                                       'article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}', // Corrects block display not defined in IE6/7/8/9\r
+                                       'audio{display:none}', // Corrects audio display not defined in IE6/7/8/9\r
+                                       'canvas,video{display:inline-block;*display:inline;*zoom:1}', // Corrects canvas and video display not defined in IE6/7/8/9 (audio[controls] in IE7)\r
+                                       '[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}', // Corrects 'hidden' attribute and audio[controls] display not present in IE7/8/9\r
+                                       'mark{background:#FF0;color:#000}', // Addresses styling not present in IE6/7/8/9\r
+                               '</style>'].join('');\r
+                               documentHead.insertBefore(div.lastChild, documentHead.firstChild);\r
+                       }\r
+\r
+                       // return document (for potential chaining)\r
+                       return scopeDocument;\r
+               }\r
+       };\r
+\r
+       // shiv the document\r
+       html5.shivDocument(doc);\r
+\r
+       win.html5 = html5;\r
+\r
+       // ie print shiv\r
+       if (supportsUnknownElements || !win.attachEvent){return;}\r
+\r
+       // replaces an element with a namespace-shived clone (eg. header element becomes shiv:header element)\r
+       function namespaceShivElement(element) {\r
+               var elementClone, a, l, i;\r
+               if (doc.documentMode > 7) {\r
+                       elementClone = doc.createElement('font');\r
+                       elementClone.setAttribute('data-html5shiv', element.nodeName.toLowerCase());\r
+               }\r
+               else {\r
+                       elementClone = doc.createElement('shiv:' + element.nodeName);\r
+               }\r
+               while (element.firstChild) {\r
+                       elementClone.appendChild(element.childNodes[0]);\r
+               }\r
+               for (a = element.attributes, l = a.length, i = 0; i < l; ++i) {\r
+                       if (a[i].specified) {\r
+                               elementClone.setAttribute(a[i].nodeName, a[i].nodeValue);\r
+                       }\r
+               }\r
+               elementClone.style.cssText = element.style.cssText;\r
+               element.parentNode.replaceChild(elementClone, element);\r
+               elementClone.originalElement = element;\r
+       }\r
+\r
+       // restores an element from a namespace-shived clone (eg. shiv:header element becomes header element)\r
+       function unNamespaceShivElement(element) {\r
+               var originalElement = element.originalElement;\r
+               while (element.childNodes.length) {\r
+                       originalElement.appendChild(element.childNodes[0]);\r
+               }\r
+               element.parentNode.replaceChild(originalElement, element);\r
+       }\r
+\r
+       // get style sheet list css text\r
+       function getStyleSheetListCssText(styleSheetList, mediaType) {\r
+               // set media type\r
+               mediaType = mediaType || 'all';\r
+\r
+               // set local variables\r
+               var\r
+               i = -1,\r
+               cssTextArr = [],\r
+               styleSheetListLength = styleSheetList.length,\r
+               styleSheet,\r
+               styleSheetMediaType;\r
+\r
+               // loop through style sheets\r
+               while (++i < styleSheetListLength) {\r
+                       // get style sheet\r
+                       styleSheet = styleSheetList[i];\r
+\r
+                       // get style sheet media type\r
+                       styleSheetMediaType = styleSheet.media || mediaType;\r
+\r
+                       // skip a disabled or non-print style sheet\r
+                       if (styleSheet.disabled || !(/print|all/.test(styleSheetMediaType))) {\r
+                               continue;\r
+                       }\r
+\r
+                       // push style sheet css text\r
+                       cssTextArr.push(getStyleSheetListCssText(styleSheet.imports, styleSheetMediaType), styleSheet.cssText);\r
+               }\r
+\r
+               // return css text\r
+               return cssTextArr.join('');\r
+       }\r
+\r
+       // shiv css text (eg. header {} becomes shiv\:header {})\r
+       function shivCssText (cssText) {\r
+               // set local variables\r
+               var\r
+               elementsRegExp = new RegExp('(^|[\\s,{}])(' + win.html5.elements.join('|') + ')', 'gi'),\r
+               cssTextSplit = cssText.split('{'),\r
+               cssTextSplitLength = cssTextSplit.length,\r
+               i = -1;\r
+\r
+               // shiv css text\r
+               while (++i < cssTextSplitLength) {\r
+                       cssTextSplit[i] = cssTextSplit[i].split('}');\r
+                       if (doc.documentMode > 7) {\r
+                               cssTextSplit[i][cssTextSplit[i].length - 1] = cssTextSplit[i][cssTextSplit[i].length - 1].replace(elementsRegExp, '$1font[data-html5shiv="$2"]');\r
+                       }\r
+                       else {\r
+                               cssTextSplit[i][cssTextSplit[i].length - 1] = cssTextSplit[i][cssTextSplit[i].length - 1].replace(elementsRegExp, '$1shiv\\:$2');\r
+                       }\r
+                       cssTextSplit[i] = cssTextSplit[i].join('}');\r
+               }\r
+\r
+               // return shived css text\r
+               return cssTextSplit.join('{');\r
+       }\r
+\r
+       // the before print function\r
+       win.attachEvent(\r
+               'onbeforeprint',\r
+               function () {\r
+                       // test for scenarios where shiving is unnecessary or unavailable\r
+                       if (win.html5.supportsXElement || !doc.namespaces) {\r
+                               return;\r
+                       }\r
+\r
+                       // add the shiv namespace\r
+                       if (!doc.namespaces.shiv) {\r
+                               doc.namespaces.add('shiv');\r
+                       }\r
+\r
+                       // set local variables\r
+                       var\r
+                       i = -1,\r
+                       elementsRegExp = new RegExp('^(' + win.html5.elements.join('|') + ')$', 'i'),\r
+                       nodeList = doc.getElementsByTagName('*'),\r
+                       nodeListLength = nodeList.length,\r
+                       element,\r
+                       // sorts style and link files and returns their stylesheets\r
+                       shivedCSS = shivCssText(getStyleSheetListCssText((function (s, l) {\r
+                               var arr = [], i = s.length;\r
+                               while (i) {\r
+                                       arr.unshift(s[--i]);\r
+                               }\r
+                               i = l.length;\r
+                               while (i) {\r
+                                       arr.unshift(l[--i]);\r
+                               }\r
+                               arr.sort(function (a, b) {\r
+                                       return (a.sourceIndex - b.sourceIndex);\r
+                               });\r
+                               i = arr.length;\r
+                               while (i) {\r
+                                       arr[--i] = arr[i].styleSheet;\r
+                               }\r
+                               return arr;\r
+                       })(doc.getElementsByTagName('style'), doc.getElementsByTagName('link'))));\r
+\r
+                       // loop through document elements\r
+                       while (++i < nodeListLength) {\r
+                               // get element\r
+                               element = nodeList[i];\r
+\r
+                               // clone matching elements as shiv namespaced\r
+                               if (elementsRegExp.test(element.nodeName)) {\r
+                                       namespaceShivElement(element);\r
+                               }\r
+                       }\r
+\r
+                       // set new shived css text\r
+                       doc.appendChild(doc._shivedStyleSheet = doc.createElement('style')).styleSheet.cssText = shivedCSS;\r
+               }\r
+       );\r
+\r
+       // the after print function\r
+       win.attachEvent(\r
+               'onafterprint',\r
+               function() {\r
+                       // test for scenarios where shiving is unnecessary\r
+                       if (win.html5.supportsXElement || !doc.namespaces) {\r
+                               return;\r
+                       }\r
+\r
+                       // set local variables\r
+                       var\r
+                       i = -1,\r
+                       nodeList = doc.getElementsByTagName('*'),\r
+                       nodeListLength = nodeList.length,\r
+                       element;\r
+\r
+                       // loop through document elements\r
+                       while (++i < nodeListLength) {\r
+                               // get element\r
+                               element = nodeList[i];\r
+\r
+                               // restore original elements\r
+                               if (element.originalElement) {\r
+                                       unNamespaceShivElement(element);\r
+                               }\r
+                       }\r
+\r
+                       // cut new shived css text\r
+                       if (doc._shivedStyleSheet) {\r
+                               doc._shivedStyleSheet.parentNode.removeChild(doc._shivedStyleSheet);\r
+                       }\r
+               }\r
+       );\r
+})(this, document);
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/js/jqModal.js b/snf-astakos-app/astakos/im/static/im/js/jqModal.js
new file mode 100644 (file)
index 0000000..3aac816
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * jqModal - Minimalist Modaling with jQuery
+ *   (http://dev.iceburg.net/jquery/jqModal/)
+ *
+ * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net>
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ * 
+ * $Version: 03/01/2009 +r14
+ */
+(function($) {
+$.fn.jqm=function(o){
+var p={
+overlay: 50,
+overlayClass: 'jqmOverlay',
+closeClass: 'jqmClose',
+trigger: '.jqModal',
+ajax: F,
+ajaxText: '',
+target: F,
+modal: F,
+toTop: F,
+onShow: F,
+onHide: F,
+onLoad: F
+};
+return this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s;
+H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};
+if(p.trigger)$(this).jqmAddTrigger(p.trigger);
+});};
+
+$.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide');};
+$.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow');};
+$.fn.jqmShow=function(t){return this.each(function(){t=t||window.event;$.jqm.open(this._jqm,t);});};
+$.fn.jqmHide=function(t){return this.each(function(){t=t||window.event;$.jqm.close(this._jqm,t)});};
+
+$.jqm = {
+hash:{},
+open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=(parseInt(h.w.css('z-index'))),z=(z>0)?z:3000,o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z);
+ if(c.modal) {if(!A[0])L('bind');A.push(s);}
+ else if(c.overlay > 0)h.w.jqmAddClose(o);
+ else o=F;
+
+ h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F;
+ if(ie6){$('html,body').css({height:'100%',width:'100%'});if(o){o=o.css({position:'absolute'})[0];for(var y in {Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'");}}
+
+ if(c.ajax) {var r=c.target||h.w,u=c.ajax,r=(typeof r == 'string')?$(r,h.w):$(r),u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u;
+  r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h);});}
+ else if(cc)h.w.jqmAddClose($(cc,h.w));
+
+ if(c.toTop&&h.o)h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o);        
+ (c.onShow)?c.onShow(h):h.w.show();e(h);return F;
+},
+close:function(s){var h=H[s];if(!h.a)return F;h.a=F;
+ if(A[0]){A.pop();if(!A[0])L('unbind');}
+ if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove();
+ if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();} return F;
+},
+params:{}};
+var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version == "6.0"),F=false,
+i=$('<iframe src="javascript:false;document.write(\'\');" class="jqm"></iframe>').css({opacity:0}),
+e=function(h){if(ie6)if(h.o)h.o.html('<p style="width:100%;height:100%"/>').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i); f(h);},
+f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(_){}},
+L=function(t){$()[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m);},
+m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return !r;},
+hs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function() {
+ if(!this[c]){this[c]=[];$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return F;});}this[c].push(s);});});};
+})(jQuery);
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/js/jquery.colorbox.js b/snf-astakos-app/astakos/im/static/im/js/jquery.colorbox.js
new file mode 100644 (file)
index 0000000..a82c6af
--- /dev/null
@@ -0,0 +1,888 @@
+// ColorBox v1.3.19 - jQuery lightbox plugin\r
+// (c) 2011 Jack Moore - jacklmoore.com\r
+// License: http://www.opensource.org/licenses/mit-license.php\r
+(function ($, document, window) {\r
+    var\r
+    // Default settings object.        \r
+    // See http://jacklmoore.com/colorbox for details.\r
+    defaults = {\r
+        transition: "elastic",\r
+        speed: 300,\r
+        width: false,\r
+        initialWidth: "600",\r
+        innerWidth: false,\r
+        maxWidth: false,\r
+        height: false,\r
+        initialHeight: "450",\r
+        innerHeight: false,\r
+        maxHeight: false,\r
+        scalePhotos: true,\r
+        scrolling: true,\r
+        inline: false,\r
+        html: false,\r
+        iframe: false,\r
+        fastIframe: true,\r
+        photo: false,\r
+        href: false,\r
+        title: false,\r
+        rel: false,\r
+        opacity: 0.9,\r
+        preloading: true,\r
+        current: "image {current} of {total}",\r
+        previous: "previous",\r
+        next: "next",\r
+        close: "close",\r
+        open: false,\r
+        returnFocus: true,\r
+        reposition: true,\r
+        loop: true,\r
+        slideshow: false,\r
+        slideshowAuto: true,\r
+        slideshowSpeed: 2500,\r
+        slideshowStart: "start slideshow",\r
+        slideshowStop: "stop slideshow",\r
+        onOpen: false,\r
+        onLoad: false,\r
+        onComplete: false,\r
+        onCleanup: false,\r
+        onClosed: false,\r
+        overlayClose: true,            \r
+        escKey: true,\r
+        arrowKey: true,\r
+        top: false,\r
+        bottom: false,\r
+        left: false,\r
+        right: false,\r
+        fixed: false,\r
+        data: undefined\r
+    },\r
+       \r
+    // Abstracting the HTML and event identifiers for easy rebranding\r
+    colorbox = 'colorbox',\r
+    prefix = 'cbox',\r
+    boxElement = prefix + 'Element',\r
+    \r
+    // Events  \r
+    event_open = prefix + '_open',\r
+    event_load = prefix + '_load',\r
+    event_complete = prefix + '_complete',\r
+    event_cleanup = prefix + '_cleanup',\r
+    event_closed = prefix + '_closed',\r
+    event_purge = prefix + '_purge',\r
+    \r
+    // Special Handling for IE\r
+    isIE = !$.support.opacity && !$.support.style, // IE7 & IE8\r
+    isIE6 = isIE && !window.XMLHttpRequest, // IE6\r
+    event_ie6 = prefix + '_IE6',\r
+\r
+    // Cached jQuery Object Variables\r
+    $overlay,\r
+    $box,\r
+    $wrap,\r
+    $content,\r
+    $topBorder,\r
+    $leftBorder,\r
+    $rightBorder,\r
+    $bottomBorder,\r
+    $related,\r
+    $window,\r
+    $loaded,\r
+    $loadingBay,\r
+    $loadingOverlay,\r
+    $title,\r
+    $current,\r
+    $slideshow,\r
+    $next,\r
+    $prev,\r
+    $close,\r
+    $groupControls,\r
+    \r
+    // Variables for cached values or use across multiple functions\r
+    settings,\r
+    interfaceHeight,\r
+    interfaceWidth,\r
+    loadedHeight,\r
+    loadedWidth,\r
+    element,\r
+    index,\r
+    photo,\r
+    open,\r
+    active,\r
+    closing,\r
+    loadingTimer,\r
+    publicMethod,\r
+    div = "div",\r
+    init;\r
+\r
+       // ****************\r
+       // HELPER FUNCTIONS\r
+       // ****************\r
+    \r
+       // Convience function for creating new jQuery objects\r
+    function $tag(tag, id, css) {\r
+               var element = document.createElement(tag);\r
+\r
+               if (id) {\r
+                       element.id = prefix + id;\r
+               }\r
+\r
+               if (css) {\r
+                       element.style.cssText = css;\r
+               }\r
+\r
+               return $(element);\r
+    }\r
+\r
+       // Determine the next and previous members in a group.\r
+       function getIndex(increment) {\r
+               var \r
+               max = $related.length, \r
+               newIndex = (index + increment) % max;\r
+               \r
+               return (newIndex < 0) ? max + newIndex : newIndex;\r
+       }\r
+\r
+       // Convert '%' and 'px' values to integers\r
+       function setSize(size, dimension) {\r
+               return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10));\r
+       }\r
+       \r
+       // Checks an href to see if it is a photo.\r
+       // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.\r
+       function isImage(url) {\r
+               return settings.photo || /\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(url);\r
+       }\r
+       \r
+       // Assigns function results to their respective properties\r
+       function makeSettings() {\r
+        var i;\r
+        settings = $.extend({}, $.data(element, colorbox));\r
+        \r
+               for (i in settings) {\r
+                       if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.\r
+                           settings[i] = settings[i].call(element);\r
+                       }\r
+               }\r
+        \r
+               settings.rel = settings.rel || element.rel || 'nofollow';\r
+               settings.href = settings.href || $(element).attr('href');\r
+               settings.title = settings.title || element.title;\r
+        \r
+        if (typeof settings.href === "string") {\r
+            settings.href = $.trim(settings.href);\r
+        }\r
+       }\r
+\r
+       function trigger(event, callback) {\r
+               $.event.trigger(event);\r
+               if (callback) {\r
+                       callback.call(element);\r
+               }\r
+       }\r
+\r
+       // Slideshow functionality\r
+       function slideshow() {\r
+               var\r
+               timeOut,\r
+               className = prefix + "Slideshow_",\r
+               click = "click." + prefix,\r
+               start,\r
+               stop,\r
+               clear;\r
+               \r
+               if (settings.slideshow && $related[1]) {\r
+                       start = function () {\r
+                               $slideshow\r
+                                       .text(settings.slideshowStop)\r
+                                       .unbind(click)\r
+                                       .bind(event_complete, function () {\r
+                                               if (settings.loop || $related[index + 1]) {\r
+                                                       timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);\r
+                                               }\r
+                                       })\r
+                                       .bind(event_load, function () {\r
+                                               clearTimeout(timeOut);\r
+                                       })\r
+                                       .one(click + ' ' + event_cleanup, stop);\r
+                               $box.removeClass(className + "off").addClass(className + "on");\r
+                               timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);\r
+                       };\r
+                       \r
+                       stop = function () {\r
+                               clearTimeout(timeOut);\r
+                               $slideshow\r
+                                       .text(settings.slideshowStart)\r
+                                       .unbind([event_complete, event_load, event_cleanup, click].join(' '))\r
+                                       .one(click, function () {\r
+                                               publicMethod.next();\r
+                                               start();\r
+                                       });\r
+                               $box.removeClass(className + "on").addClass(className + "off");\r
+                       };\r
+                       \r
+                       if (settings.slideshowAuto) {\r
+                               start();\r
+                       } else {\r
+                               stop();\r
+                       }\r
+               } else {\r
+            $box.removeClass(className + "off " + className + "on");\r
+        }\r
+       }\r
+\r
+       function launch(target) {\r
+               if (!closing) {\r
+                       \r
+                       element = target;\r
+                       \r
+                       makeSettings();\r
+                       \r
+                       $related = $(element);\r
+                       \r
+                       index = 0;\r
+                       \r
+                       if (settings.rel !== 'nofollow') {\r
+                               $related = $('.' + boxElement).filter(function () {\r
+                                       var relRelated = $.data(this, colorbox).rel || this.rel;\r
+                                       return (relRelated === settings.rel);\r
+                               });\r
+                               index = $related.index(element);\r
+                               \r
+                               // Check direct calls to ColorBox.\r
+                               if (index === -1) {\r
+                                       $related = $related.add(element);\r
+                                       index = $related.length - 1;\r
+                               }\r
+                       }\r
+                       \r
+                       if (!open) {\r
+                               open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.\r
+                               \r
+                               $box.show();\r
+                               \r
+                               if (settings.returnFocus) {\r
+                                       $(element).blur().one(event_closed, function () {\r
+                                               $(this).focus();\r
+                                       });\r
+                               }\r
+                               \r
+                               // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5'\r
+                               $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();\r
+                               \r
+                               // Opens inital empty ColorBox prior to content being loaded.\r
+                               settings.w = setSize(settings.initialWidth, 'x');\r
+                               settings.h = setSize(settings.initialHeight, 'y');\r
+                               publicMethod.position();\r
+                               \r
+                               if (isIE6) {\r
+                                       $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {\r
+                                               $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});\r
+                                       }).trigger('resize.' + event_ie6);\r
+                               }\r
+                               \r
+                               trigger(event_open, settings.onOpen);\r
+                               \r
+                               $groupControls.add($title).hide();\r
+                               \r
+                               $close.html(settings.close).show();\r
+                       }\r
+                       \r
+                       publicMethod.load(true);\r
+               }\r
+       }\r
+\r
+       // ColorBox's markup needs to be added to the DOM prior to being called\r
+       // so that the browser will go ahead and load the CSS background images.\r
+       function appendHTML() {\r
+               if (!$box && document.body) {\r
+                       init = false;\r
+\r
+                       $window = $(window);\r
+                       $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();\r
+                       $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide();\r
+                       $wrap = $tag(div, "Wrapper");\r
+                       $content = $tag(div, "Content").append(\r
+                               $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'),\r
+                               $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")),\r
+                               $title = $tag(div, "Title"),\r
+                               $current = $tag(div, "Current"),\r
+                               $next = $tag(div, "Next"),\r
+                               $prev = $tag(div, "Previous"),\r
+                               $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow),\r
+                               $close = $tag(div, "Close")\r
+                       );\r
+                       \r
+                       $wrap.append( // The 3x3 Grid that makes up ColorBox\r
+                               $tag(div).append(\r
+                                       $tag(div, "TopLeft"),\r
+                                       $topBorder = $tag(div, "TopCenter"),\r
+                                       $tag(div, "TopRight")\r
+                               ),\r
+                               $tag(div, false, 'clear:left').append(\r
+                                       $leftBorder = $tag(div, "MiddleLeft"),\r
+                                       $content,\r
+                                       $rightBorder = $tag(div, "MiddleRight")\r
+                               ),\r
+                               $tag(div, false, 'clear:left').append(\r
+                                       $tag(div, "BottomLeft"),\r
+                                       $bottomBorder = $tag(div, "BottomCenter"),\r
+                                       $tag(div, "BottomRight")\r
+                               )\r
+                       ).find('div div').css({'float': 'left'});\r
+                       \r
+                       $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');\r
+                       \r
+                       $groupControls = $next.add($prev).add($current).add($slideshow);\r
+\r
+                       $(document.body).append($overlay, $box.append($wrap, $loadingBay));\r
+               }\r
+       }\r
+\r
+       // Add ColorBox's event bindings\r
+       function addBindings() {\r
+               if ($box) {\r
+                       if (!init) {\r
+                               init = true;\r
+\r
+                               // Cache values needed for size calculations\r
+                               interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6\r
+                               interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();\r
+                               loadedHeight = $loaded.outerHeight(true);\r
+                               loadedWidth = $loaded.outerWidth(true);\r
+                               \r
+                               // Setting padding to remove the need to do size conversions during the animation step.\r
+                               $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth});\r
+\r
+                               // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.\r
+                               $next.click(function () {\r
+                                       publicMethod.next();\r
+                               });\r
+                               $prev.click(function () {\r
+                                       publicMethod.prev();\r
+                               });\r
+                               $close.click(function () {\r
+                                       publicMethod.close();\r
+                               });\r
+                               $overlay.click(function () {\r
+                                       if (settings.overlayClose) {\r
+                                               publicMethod.close();\r
+                                       }\r
+                               });\r
+                               \r
+                               // Key Bindings\r
+                               $(document).bind('keydown.' + prefix, function (e) {\r
+                                       var key = e.keyCode;\r
+                                       if (open && settings.escKey && key === 27) {\r
+                                               e.preventDefault();\r
+                                               publicMethod.close();\r
+                                       }\r
+                                       if (open && settings.arrowKey && $related[1]) {\r
+                                               if (key === 37) {\r
+                                                       e.preventDefault();\r
+                                                       $prev.click();\r
+                                               } else if (key === 39) {\r
+                                                       e.preventDefault();\r
+                                                       $next.click();\r
+                                               }\r
+                                       }\r
+                               });\r
+\r
+                               $('.' + boxElement, document).live('click', function (e) {\r
+                               // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.\r
+                               // See: http://jacklmoore.com/notes/click-events/\r
+                               if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) {\r
+                                   e.preventDefault();\r
+                                   launch(this);\r
+                               }\r
+                           });\r
+                       }\r
+                       return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       // Don't do anything if ColorBox already exists.\r
+       if ($.colorbox) {\r
+               return;\r
+       }\r
+\r
+       // Append the HTML when the DOM loads\r
+       $(appendHTML);\r
+\r
+\r
+       // ****************\r
+       // PUBLIC FUNCTIONS\r
+       // Usage format: $.fn.colorbox.close();\r
+       // Usage from within an iframe: parent.$.fn.colorbox.close();\r
+       // ****************\r
+       \r
+       publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {\r
+               var $this = this;\r
+               \r
+        options = options || {};\r
+        \r
+        appendHTML();\r
+\r
+               if (addBindings()) {\r
+                       if (!$this[0]) {\r
+                               if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.\r
+                       return $this;\r
+                   }\r
+                   // if no selector was given (ie. $.colorbox()), create a temporary element to work with\r
+                               $this = $('<a/>');\r
+                               options.open = true; // assume an immediate open\r
+                       }\r
+                       \r
+                       if (callback) {\r
+                               options.onComplete = callback;\r
+                       }\r
+                       \r
+                       $this.each(function () {\r
+                               $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));\r
+                       }).addClass(boxElement);\r
+                       \r
+               if (($.isFunction(options.open) && options.open.call($this)) || options.open) {\r
+                               launch($this[0]);\r
+                       }\r
+               }\r
+        \r
+               return $this;\r
+       };\r
+\r
+       publicMethod.position = function (speed, loadedCallback) {\r
+        var \r
+        top = 0, \r
+        left = 0, \r
+        offset = $box.offset(),\r
+        scrollTop = $window.scrollTop(), \r
+        scrollLeft = $window.scrollLeft();\r
+        \r
+        $window.unbind('resize.' + prefix);\r
+\r
+        // remove the modal so that it doesn't influence the document width/height        \r
+        $box.css({top: -9e4, left: -9e4});\r
+\r
+        if (settings.fixed && !isIE6) {\r
+                       offset.top -= scrollTop;\r
+                       offset.left -= scrollLeft;\r
+            $box.css({position: 'fixed'});\r
+        } else {\r
+            top = scrollTop;\r
+            left = scrollLeft;\r
+            $box.css({position: 'absolute'});\r
+        }\r
+\r
+               // keeps the top and left positions within the browser's viewport.\r
+        if (settings.right !== false) {\r
+            left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);\r
+        } else if (settings.left !== false) {\r
+            left += setSize(settings.left, 'x');\r
+        } else {\r
+            left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);\r
+        }\r
+        \r
+        if (settings.bottom !== false) {\r
+            top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);\r
+        } else if (settings.top !== false) {\r
+            top += setSize(settings.top, 'y');\r
+        } else {\r
+            top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2);\r
+        }\r
+\r
+        $box.css({top: offset.top, left: offset.left});\r
+\r
+               // setting the speed to 0 to reduce the delay between same-sized content.\r
+               speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;\r
+        \r
+               // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,\r
+               // but it has to be shrank down around the size of div#colorbox when it's done.  If not,\r
+               // it can invoke an obscure IE bug when using iframes.\r
+               $wrap[0].style.width = $wrap[0].style.height = "9999px";\r
+               \r
+               function modalDimensions(that) {\r
+                       $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;\r
+                       $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;\r
+               }\r
+               \r
+               $box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}, {\r
+                       duration: speed,\r
+                       complete: function () {\r
+                               modalDimensions(this);\r
+                               \r
+                               active = false;\r
+                               \r
+                               // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.\r
+                               $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";\r
+                               $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";\r
+                \r
+                if (settings.reposition) {\r
+                       setTimeout(function () {  // small delay before binding onresize due to an IE8 bug.\r
+                           $window.bind('resize.' + prefix, publicMethod.position);\r
+                       }, 1);\r
+                   }\r
+\r
+                               if (loadedCallback) {\r
+                                       loadedCallback();\r
+                               }\r
+                       },\r
+                       step: function () {\r
+                               modalDimensions(this);\r
+                       }\r
+               });\r
+       };\r
+\r
+       publicMethod.resize = function (options) {\r
+               if (open) {\r
+                       options = options || {};\r
+                       \r
+                       if (options.width) {\r
+                               settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;\r
+                       }\r
+                       if (options.innerWidth) {\r
+                               settings.w = setSize(options.innerWidth, 'x');\r
+                       }\r
+                       $loaded.css({width: settings.w});\r
+                       \r
+                       if (options.height) {\r
+                               settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;\r
+                       }\r
+                       if (options.innerHeight) {\r
+                               settings.h = setSize(options.innerHeight, 'y');\r
+                       }\r
+                       if (!options.innerHeight && !options.height) {\r
+                               $loaded.css({height: "auto"});\r
+                               settings.h = $loaded.height();\r
+                       }\r
+                       $loaded.css({height: settings.h});\r
+                       \r
+                       publicMethod.position(settings.transition === "none" ? 0 : settings.speed);\r
+               }\r
+       };\r
+\r
+       publicMethod.prep = function (object) {\r
+               if (!open) {\r
+                       return;\r
+               }\r
+               \r
+               var callback, speed = settings.transition === "none" ? 0 : settings.speed;\r
+               \r
+               $loaded.remove();\r
+               $loaded = $tag(div, 'LoadedContent').append(object);\r
+               \r
+               function getWidth() {\r
+                       settings.w = settings.w || $loaded.width();\r
+                       settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;\r
+                       return settings.w;\r
+               }\r
+               function getHeight() {\r
+                       settings.h = settings.h || $loaded.height();\r
+                       settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;\r
+                       return settings.h;\r
+               }\r
+               \r
+               $loaded.hide()\r
+               .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.\r
+               .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})\r
+               .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.\r
+               .prependTo($content);\r
+               \r
+               $loadingBay.hide();\r
+               \r
+               // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.\r
+               //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});\r
+               \r
+        $(photo).css({'float': 'none'});\r
+        \r
+               // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay.\r
+               if (isIE6) {\r
+                       $('select').not($box.find('select')).filter(function () {\r
+                               return this.style.visibility !== 'hidden';\r
+                       }).css({'visibility': 'hidden'}).one(event_cleanup, function () {\r
+                               this.style.visibility = 'inherit';\r
+                       });\r
+               }\r
+               \r
+               callback = function () {\r
+            var preload, i, total = $related.length, iframe, frameBorder = 'frameBorder', allowTransparency = 'allowTransparency', complete, src, img;\r
+            \r
+            if (!open) {\r
+                return;\r
+            }\r
+            \r
+            function removeFilter() {\r
+                if (isIE) {\r
+                    $box[0].style.removeAttribute('filter');\r
+                }\r
+            }\r
+            \r
+            complete = function () {\r
+                clearTimeout(loadingTimer);\r
+                $loadingOverlay.hide();\r
+                trigger(event_complete, settings.onComplete);\r
+            };\r
+            \r
+            if (isIE) {\r
+                //This fadeIn helps the bicubic resampling to kick-in.\r
+                if (photo) {\r
+                    $loaded.fadeIn(100);\r
+                }\r
+            }\r
+            \r
+            $title.html(settings.title).add($loaded).show();\r
+            \r
+            if (total > 1) { // handle grouping\r
+                if (typeof settings.current === "string") {\r
+                    $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();\r
+                }\r
+                \r
+                $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);\r
+                $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);\r
+                               \r
+                if (settings.slideshow) {\r
+                    $slideshow.show();\r
+                }\r
+                               \r
+                // Preloads images within a rel group\r
+                if (settings.preloading) {\r
+                                       preload = [\r
+                                               getIndex(-1),\r
+                                               getIndex(1)\r
+                                       ];\r
+                                       while (i = $related[preload.pop()]) {\r
+                                               src = $.data(i, colorbox).href || i.href;\r
+                                               if ($.isFunction(src)) {\r
+                                                       src = src.call(i);\r
+                                               }\r
+                                               if (isImage(src)) {\r
+                                                       img = new Image();\r
+                                                       img.src = src;\r
+                                               }\r
+                                       }\r
+                }\r
+            } else {\r
+                $groupControls.hide();\r
+            }\r
+            \r
+            if (settings.iframe) {\r
+                iframe = $tag('iframe')[0];\r
+                \r
+                if (frameBorder in iframe) {\r
+                    iframe[frameBorder] = 0;\r
+                }\r
+                if (allowTransparency in iframe) {\r
+                    iframe[allowTransparency] = "true";\r
+                }\r
+                // give the iframe a unique name to prevent caching\r
+                iframe.name = prefix + (+new Date());\r
+                if (settings.fastIframe) {\r
+                    complete();\r
+                } else {\r
+                    $(iframe).one('load', complete);\r
+                }\r
+                iframe.src = settings.href;\r
+                if (!settings.scrolling) {\r
+                    iframe.scrolling = "no";\r
+                }\r
+                $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () {\r
+                    iframe.src = "//about:blank";\r
+                });\r
+            } else {\r
+                complete();\r
+            }\r
+            \r
+            if (settings.transition === 'fade') {\r
+                $box.fadeTo(speed, 1, removeFilter);\r
+            } else {\r
+                removeFilter();\r
+            }\r
+               };\r
+               \r
+               if (settings.transition === 'fade') {\r
+                       $box.fadeTo(speed, 0, function () {\r
+                               publicMethod.position(0, callback);\r
+                       });\r
+               } else {\r
+                       publicMethod.position(speed, callback);\r
+               }\r
+       };\r
+\r
+       publicMethod.load = function (launched) {\r
+               var href, setResize, prep = publicMethod.prep;\r
+               \r
+               active = true;\r
+               \r
+               photo = false;\r
+               \r
+               element = $related[index];\r
+               \r
+               if (!launched) {\r
+                       makeSettings();\r
+               }\r
+               \r
+               trigger(event_purge);\r
+               \r
+               trigger(event_load, settings.onLoad);\r
+               \r
+               settings.h = settings.height ?\r
+                               setSize(settings.height, 'y') - loadedHeight - interfaceHeight :\r
+                               settings.innerHeight && setSize(settings.innerHeight, 'y');\r
+               \r
+               settings.w = settings.width ?\r
+                               setSize(settings.width, 'x') - loadedWidth - interfaceWidth :\r
+                               settings.innerWidth && setSize(settings.innerWidth, 'x');\r
+               \r
+               // Sets the minimum dimensions for use in image scaling\r
+               settings.mw = settings.w;\r
+               settings.mh = settings.h;\r
+               \r
+               // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.\r
+               // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.\r
+               if (settings.maxWidth) {\r
+                       settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;\r
+                       settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;\r
+               }\r
+               if (settings.maxHeight) {\r
+                       settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;\r
+                       settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;\r
+               }\r
+               \r
+               href = settings.href;\r
+               \r
+        loadingTimer = setTimeout(function () {\r
+            $loadingOverlay.show();\r
+        }, 100);\r
+        \r
+               if (settings.inline) {\r
+                       // Inserts an empty placeholder where inline content is being pulled from.\r
+                       // An event is bound to put inline content back when ColorBox closes or loads new content.\r
+                       $tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () {\r
+                               $(this).replaceWith($loaded.children());\r
+                       });\r
+                       prep($(href));\r
+               } else if (settings.iframe) {\r
+                       // IFrame element won't be added to the DOM until it is ready to be displayed,\r
+                       // to avoid problems with DOM-ready JS that might be trying to run in that iframe.\r
+                       prep(" ");\r
+               } else if (settings.html) {\r
+                       prep(settings.html);\r
+               } else if (isImage(href)) {\r
+                       $(photo = new Image())\r
+                       .addClass(prefix + 'Photo')\r
+                       .error(function () {\r
+                               settings.title = false;\r
+                               prep($tag(div, 'Error').text('This image could not be loaded'));\r
+                       })\r
+                       .load(function () {\r
+                               var percent;\r
+                               photo.onload = null; //stops animated gifs from firing the onload repeatedly.\r
+                               \r
+                               if (settings.scalePhotos) {\r
+                                       setResize = function () {\r
+                                               photo.height -= photo.height * percent;\r
+                                               photo.width -= photo.width * percent;   \r
+                                       };\r
+                                       if (settings.mw && photo.width > settings.mw) {\r
+                                               percent = (photo.width - settings.mw) / photo.width;\r
+                                               setResize();\r
+                                       }\r
+                                       if (settings.mh && photo.height > settings.mh) {\r
+                                               percent = (photo.height - settings.mh) / photo.height;\r
+                                               setResize();\r
+                                       }\r
+                               }\r
+                               \r
+                               if (settings.h) {\r
+                                       photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px';\r
+                               }\r
+                               \r
+                               if ($related[1] && (settings.loop || $related[index + 1])) {\r
+                                       photo.style.cursor = 'pointer';\r
+                                       photo.onclick = function () {\r
+                        publicMethod.next();\r
+                    };\r
+                               }\r
+                               \r
+                               if (isIE) {\r
+                                       photo.style.msInterpolationMode = 'bicubic';\r
+                               }\r
+                               \r
+                               setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.\r
+                                       prep(photo);\r
+                               }, 1);\r
+                       });\r
+                       \r
+                       setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.\r
+                               photo.src = href;\r
+                       }, 1);\r
+               } else if (href) {\r
+                       $loadingBay.load(href, settings.data, function (data, status, xhr) {\r
+                               prep(status === 'error' ? $tag(div, 'Error').text('Request unsuccessful: ' + xhr.statusText) : $(this).contents());\r
+                       });\r
+               }\r
+       };\r
+        \r
+       // Navigates to the next page/image in a set.\r
+       publicMethod.next = function () {\r
+               if (!active && $related[1] && (settings.loop || $related[index + 1])) {\r
+                       index = getIndex(1);\r
+                       publicMethod.load();\r
+               }\r
+       };\r
+       \r
+       publicMethod.prev = function () {\r
+               if (!active && $related[1] && (settings.loop || index)) {\r
+                       index = getIndex(-1);\r
+                       publicMethod.load();\r
+               }\r
+       };\r
+\r
+       // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();\r
+       publicMethod.close = function () {\r
+               if (open && !closing) {\r
+                       \r
+                       closing = true;\r
+                       \r
+                       open = false;\r
+                       \r
+                       trigger(event_cleanup, settings.onCleanup);\r
+                       \r
+                       $window.unbind('.' + prefix + ' .' + event_ie6);\r
+                       \r
+                       $overlay.fadeTo(200, 0);\r
+                       \r
+                       $box.stop().fadeTo(300, 0, function () {\r
+                 \r
+                               $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();\r
+                               \r
+                               trigger(event_purge);\r
+                               \r
+                               $loaded.remove();\r
+                               \r
+                               setTimeout(function () {\r
+                                       closing = false;\r
+                                       trigger(event_closed, settings.onClosed);\r
+                               }, 1);\r
+                       });\r
+               }\r
+       };\r
+\r
+       // Removes changes ColorBox made to the document, but does not remove the plugin\r
+       // from jQuery.\r
+       publicMethod.remove = function () {\r
+               $([]).add($box).add($overlay).remove();\r
+               $box = null;\r
+               $('.' + boxElement)\r
+                       .removeData(colorbox)\r
+                       .removeClass(boxElement)\r
+                       .die();\r
+       };\r
+\r
+       // A method for fetching the current element ColorBox is referencing.\r
+       // returns a jQuery object.\r
+       publicMethod.element = function () {\r
+               return $(element);\r
+       };\r
+\r
+       publicMethod.settings = defaults;\r
+\r
+}(jQuery, document, this));
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/js/jquery.dropkick-1.0.0.js b/snf-astakos-app/astakos/im/static/im/js/jquery.dropkick-1.0.0.js
new file mode 100644 (file)
index 0000000..aaffc4b
--- /dev/null
@@ -0,0 +1,402 @@
+/**
+ * DropKick
+ *
+ * Highly customizable <select> lists
+ * https://github.com/JamieLottering/DropKick
+ *
+ * &copy; 2011 Jamie Lottering <http://github.com/JamieLottering>
+ *                        <http://twitter.com/JamieLottering>
+ * 
+ */
+(function ($, window, document) {
+
+  var ie6 = false;
+
+  // Help prevent flashes of unstyled content
+  if ($.browser.msie && $.browser.version.substr(0, 1) < 7) {
+    ie6 = true;
+  } else {
+    document.documentElement.className = document.documentElement.className + ' dk_fouc';
+  }
+  
+  var
+    // Public methods exposed to $.fn.dropkick()
+    methods = {},
+
+    // Cache every <select> element that gets dropkicked
+    lists   = [],
+
+    // Convenience keys for keyboard navigation
+    keyMap = {
+      'left'  : 37,
+      'up'    : 38,
+      'right' : 39,
+      'down'  : 40,
+      'enter' : 13
+    },
+
+    // HTML template for the dropdowns
+    dropdownTemplate = [
+      '<div class="dk_container" id="dk_container_{{ id }}" tabindex="{{ tabindex }}">',
+        '<a class="dk_toggle">',
+          '<span class="dk_label">{{ label }}</span>',
+        '</a>',
+        '<div class="dk_options">',
+          '<ul class="dk_options_inner">',
+          '</ul>',
+        '</div>',
+      '</div>'
+    ].join(''),
+
+    // HTML template for dropdown options
+    optionTemplate = '<li class="{{ current }}"><a data-dk-dropdown-value="{{ value }}">{{ text }}</a></li>',
+
+    // Some nice default values
+    defaults = {
+      startSpeed : 1000,  // I recommend a high value here, I feel it makes the changes less noticeable to the user
+      theme  : false,
+      change : false
+    },
+
+    // Make sure we only bind keydown on the document once
+    keysBound = false
+  ;
+
+  // Called by using $('foo').dropkick();
+  methods.init = function (settings) {
+    settings = $.extend({}, defaults, settings);
+
+    return this.each(function () {
+      var
+        // The current <select> element
+        $select = $(this),
+
+        // Store a reference to the originally selected <option> element
+        $original = $select.find(':selected').first(),
+
+        // Save all of the <option> elements
+        $options = $select.find('option'),
+
+        // We store lots of great stuff using jQuery data
+        data = $select.data('dropkick') || {},
+
+        // This gets applied to the 'dk_container' element
+        id = $select.attr('id') || $select.attr('name'),
+
+        // This gets updated to be equal to the longest <option> element
+        width  = settings.width || $select.outerWidth(),
+
+        // Check if we have a tabindex set or not
+        tabindex  = $select.attr('tabindex') ? $select.attr('tabindex') : '',
+
+        // The completed dk_container element
+        $dk = false,
+
+        theme
+      ;
+
+      // Dont do anything if we've already setup dropkick on this element
+      if (data.id) {
+        return $select;
+      } else {
+        data.settings  = settings;
+        data.tabindex  = tabindex;
+        data.id        = id;
+        data.$original = $original;
+        data.$select   = $select;
+        data.value     = _notBlank($select.val()) || _notBlank($original.attr('value'));
+        data.label     = $original.text();
+        data.options   = $options;
+      }
+
+      // Build the dropdown HTML
+      $dk = _build(dropdownTemplate, data);
+
+      // Make the dropdown fixed width if desired
+      $dk.find('.dk_toggle').css({
+        'width' : width + 'px'
+      });
+
+      // Hide the <select> list and place our new one in front of it
+      $select.before($dk);
+
+      // Update the reference to $dk
+      $dk = $('#dk_container_' + id).fadeIn(settings.startSpeed);
+
+      // Save the current theme
+      theme = settings.theme ? settings.theme : 'default';
+      $dk.addClass('dk_theme_' + theme);
+      data.theme = theme;
+
+      // Save the updated $dk reference into our data object
+      data.$dk = $dk;
+
+      // Save the dropkick data onto the <select> element
+      $select.data('dropkick', data);
+
+      // Do the same for the dropdown, but add a few helpers
+      $dk.data('dropkick', data);
+
+      lists[lists.length] = $select;
+
+      // Focus events
+      $dk.bind('focus.dropkick', function (e) {
+        $dk.addClass('dk_focus');
+      }).bind('blur.dropkick', function (e) {
+        $dk.removeClass('dk_open dk_focus');
+      });
+
+      setTimeout(function () {
+        $select.hide();
+      }, 0);
+    });
+  };
+
+  // Allows dynamic theme changes
+  methods.theme = function (newTheme) {
+    var
+      $select   = $(this),
+      list      = $select.data('dropkick'),
+      $dk       = list.$dk,
+      oldtheme  = 'dk_theme_' + list.theme
+    ;
+
+    $dk.removeClass(oldtheme).addClass('dk_theme_' + newTheme);
+
+    list.theme = newTheme;
+  };
+
+  // Reset all <selects and dropdowns in our lists array
+  methods.reset = function () {
+    for (var i = 0, l = lists.length; i < l; i++) {
+      var
+        listData  = lists[i].data('dropkick'),
+        $dk       = listData.$dk,
+        $current  = $dk.find('li').first()
+      ;
+
+      $dk.find('.dk_label').text(listData.label);
+      $dk.find('.dk_options_inner').animate({ scrollTop: 0 }, 0);
+
+      _setCurrent($current, $dk);
+      _updateFields($current, $dk, true);
+    }
+  };
+
+  // Expose the plugin
+  $.fn.dropkick = function (method) {
+    if (!ie6) {
+      if (methods[method]) {
+        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+      } else if (typeof method === 'object' || ! method) {
+        return methods.init.apply(this, arguments);
+      }
+    }
+  };
+
+  // private
+  function _handleKeyBoardNav(e, $dk) {
+    var
+      code     = e.keyCode,
+      data     = $dk.data('dropkick'),
+      options  = $dk.find('.dk_options'),
+      open     = $dk.hasClass('dk_open'),
+      current  = $dk.find('.dk_option_current'),
+      first    = options.find('li').first(),
+      last     = options.find('li').last(),
+      next,
+      prev
+    ;
+
+    switch (code) {
+      case keyMap.enter:
+        if (open) {
+          _updateFields(current.find('a'), $dk);
+          _closeDropdown($dk);
+        } else {
+          _openDropdown($dk);
+        }
+        e.preventDefault();
+      break;
+
+      case keyMap.up:
+        prev = current.prev('li');
+        if (open) {
+          if (prev.length) {
+            _setCurrent(prev, $dk);
+          } else {
+            _setCurrent(last, $dk);
+          }
+        } else {
+          _openDropdown($dk);
+        }
+        e.preventDefault();
+      break;
+
+      case keyMap.down:
+        if (open) {
+          next = current.next('li').first();
+          if (next.length) {
+            _setCurrent(next, $dk);
+          } else {
+            _setCurrent(first, $dk);
+          }
+        } else {
+          _openDropdown($dk);
+        }
+        e.preventDefault();
+      break;
+
+      default:
+      break;
+    }
+  }
+
+  // Update the <select> value, and the dropdown label
+  function _updateFields(option, $dk, reset) {
+    var value, label, data;
+
+    value = option.attr('data-dk-dropdown-value');
+    label = option.text();
+    data  = $dk.data('dropkick');
+
+    $select = data.$select;
+    $select.val(value);
+
+    $dk.find('.dk_label').text(label);
+
+    reset = reset || false;
+
+    if (data.settings.change && !reset) {
+      data.settings.change.call($select, value, label);
+    }
+  }
+
+  // Set the currently selected option
+  function _setCurrent($current, $dk) {
+    $dk.find('.dk_option_current').removeClass('dk_option_current');
+    $current.addClass('dk_option_current');
+
+    _setScrollPos($dk, $current);
+  }
+
+  function _setScrollPos($dk, anchor) {
+    var height = anchor.prevAll('li').outerHeight() * anchor.prevAll('li').length;
+    $dk.find('.dk_options_inner').animate({ scrollTop: height + 'px' }, 0);
+  }
+
+  // Close a dropdown
+  function _closeDropdown($dk) {
+    $dk.removeClass('dk_open');
+  }
+
+  // Open a dropdown
+  function _openDropdown($dk) {
+    var data = $dk.data('dropkick');
+    $dk.find('.dk_options').css({ top : $dk.find('.dk_toggle').outerHeight() - 1 });
+    $dk.toggleClass('dk_open');
+
+  }
+
+  /**
+   * Turn the dropdownTemplate into a jQuery object and fill in the variables.
+   */
+  function _build (tpl, view) {
+    var
+      // Template for the dropdown
+      template  = tpl,
+      // Holder of the dropdowns options
+      options   = [],
+      $dk
+    ;
+
+    template = template.replace('{{ id }}', view.id);
+    template = template.replace('{{ label }}', view.label);
+    template = template.replace('{{ tabindex }}', view.tabindex);
+
+    if (view.options && view.options.length) {
+      for (var i = 0, l = view.options.length; i < l; i++) {
+        var
+          $option   = $(view.options[i]),
+          current   = 'dk_option_current',
+          oTemplate = optionTemplate
+        ;
+
+        oTemplate = oTemplate.replace('{{ value }}', $option.val());
+        oTemplate = oTemplate.replace('{{ current }}', (_notBlank($option.val()) === view.value) ? current : '');
+        oTemplate = oTemplate.replace('{{ text }}', $option.text());
+
+        options[options.length] = oTemplate;
+      }
+    }
+
+    $dk = $(template);
+    $dk.find('.dk_options_inner').html(options.join(''));
+
+    return $dk;
+  }
+
+  function _notBlank(text) {
+    return ($.trim(text).length > 0) ? text : false;
+  }
+
+  $(function () {
+
+    // Handle click events on the dropdown toggler
+    $('.dk_toggle').live('click', function (e) {
+      var $dk  = $(this).parents('.dk_container').first();
+
+      _openDropdown($dk);
+
+      if ("ontouchstart" in window) {
+        $dk.addClass('dk_touch');
+        $dk.find('.dk_options_inner').addClass('scrollable vertical');
+      }
+
+      e.preventDefault();
+      return false;
+    });
+
+    // Handle click events on individual dropdown options
+    $('.dk_options a').live(($.browser.msie ? 'mousedown' : 'click'), function (e) {
+      var
+        $option = $(this),
+        $dk     = $option.parents('.dk_container').first(),
+        data    = $dk.data('dropkick')
+      ;
+    
+      _closeDropdown($dk);
+      _updateFields($option, $dk);
+      _setCurrent($option.parent(), $dk);
+    
+      e.preventDefault();
+      return false;
+    });
+
+    // Setup keyboard nav
+    $(document).bind('keydown.dk_nav', function (e) {
+      var
+        // Look for an open dropdown...
+        $open    = $('.dk_container.dk_open'),
+
+        // Look for a focused dropdown
+        $focused = $('.dk_container.dk_focus'),
+
+        // Will be either $open, $focused, or null
+        $dk = null
+      ;
+
+      // If we have an open dropdown, key events should get sent to that one
+      if ($open.length) {
+        $dk = $open;
+      } else if ($focused.length && !$open.length) {
+        // But if we have no open dropdowns, use the focused dropdown instead
+        $dk = $focused;
+      }
+
+      if ($dk) {
+        _handleKeyBoardNav(e, $dk);
+      }
+    });
+  });
+})(jQuery, window, document);
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/static/im/js/os.js b/snf-astakos-app/astakos/im/static/im/js/os.js
new file mode 100644 (file)
index 0000000..8dfaba7
--- /dev/null
@@ -0,0 +1,117 @@
+var BrowserDetect = {\r
+       init: function () {\r
+               this.browser = this.searchString(this.dataBrowser) || "An unknown browser";\r
+               this.version = this.searchVersion(navigator.userAgent)\r
+                       || this.searchVersion(navigator.appVersion)\r
+                       || "an unknown version";\r
+               this.OS = this.searchString(this.dataOS) || "an unknown OS";\r
+       },\r
+       searchString: function (data) {\r
+               for (var i=0;i<data.length;i++) {\r
+                       var dataString = data[i].string;\r
+                       var dataProp = data[i].prop;\r
+                       this.versionSearchString = data[i].versionSearch || data[i].identity;\r
+                       if (dataString) {\r
+                               if (dataString.indexOf(data[i].subString) != -1)\r
+                                       return data[i].identity;\r
+                       }\r
+                       else if (dataProp)\r
+                               return data[i].identity;\r
+               }\r
+       },\r
+       searchVersion: function (dataString) {\r
+               var index = dataString.indexOf(this.versionSearchString);\r
+               if (index == -1) return;\r
+               return parseFloat(dataString.substring(index+this.versionSearchString.length+1));\r
+       },\r
+       dataBrowser: [\r
+               {\r
+                       string: navigator.userAgent,\r
+                       subString: "Chrome",\r
+                       identity: "Chrome"\r
+               },\r
+               {       string: navigator.userAgent,\r
+                       subString: "OmniWeb",\r
+                       versionSearch: "OmniWeb/",\r
+                       identity: "OmniWeb"\r
+               },\r
+               {\r
+                       string: navigator.vendor,\r
+                       subString: "Apple",\r
+                       identity: "Safari",\r
+                       versionSearch: "Version"\r
+               },\r
+               {\r
+                       prop: window.opera,\r
+                       identity: "Opera",\r
+                       versionSearch: "Version"\r
+               },\r
+               {\r
+                       string: navigator.vendor,\r
+                       subString: "iCab",\r
+                       identity: "iCab"\r
+               },\r
+               {\r
+                       string: navigator.vendor,\r
+                       subString: "KDE",\r
+                       identity: "Konqueror"\r
+               },\r
+               {\r
+                       string: navigator.userAgent,\r
+                       subString: "Firefox",\r
+                       identity: "Firefox"\r
+               },\r
+               {\r
+                       string: navigator.vendor,\r
+                       subString: "Camino",\r
+                       identity: "Camino"\r
+               },\r
+               {               // for newer Netscapes (6+)\r
+                       string: navigator.userAgent,\r
+                       subString: "Netscape",\r
+                       identity: "Netscape"\r
+               },\r
+               {\r
+                       string: navigator.userAgent,\r
+                       subString: "MSIE",\r
+                       identity: "Explorer",\r
+                       versionSearch: "MSIE"\r
+               },\r
+               {\r
+                       string: navigator.userAgent,\r
+                       subString: "Gecko",\r
+                       identity: "Mozilla",\r
+                       versionSearch: "rv"\r
+               },\r
+               {               // for older Netscapes (4-)\r
+                       string: navigator.userAgent,\r
+                       subString: "Mozilla",\r
+                       identity: "Netscape",\r
+                       versionSearch: "Mozilla"\r
+               }\r
+       ],\r
+       dataOS : [\r
+               {\r
+                       string: navigator.platform,\r
+                       subString: "Win",\r
+                       identity: "Windows"\r
+               },\r
+               {\r
+                       string: navigator.platform,\r
+                       subString: "Mac",\r
+                       identity: "Mac"\r
+               },\r
+               {\r
+                          string: navigator.userAgent,\r
+                          subString: "iPhone",\r
+                          identity: "iPhone/iPod"\r
+           },\r
+               {\r
+                       string: navigator.platform,\r
+                       subString: "Linux",\r
+                       identity: "Linux"\r
+               }\r
+       ]\r
+\r
+};\r
+BrowserDetect.init();\r
diff --git a/snf-astakos-app/astakos/im/static/im/js/resources_list.js b/snf-astakos-app/astakos/im/static/im/js/resources_list.js
new file mode 100644 (file)
index 0000000..6b293b7
--- /dev/null
@@ -0,0 +1,120 @@
+// Array Remove - By John Resig (MIT Licensed)\r
+Array.prototype.remove = function(from, to) {\r
+  var rest = this.slice((to || from) + 1 || this.length);\r
+  this.length = from < 0 ? this.length + from : from;\r
+  return this.push.apply(this, rest);\r
+};\r
+\r
+function ResourcesModule(el, conf) {\r
+    \r
+    var defaults = {'page_limit': 5};\r
+    this.conf = $.extend(defaults, conf);\r
+\r
+    this.el = el;\r
+    \r
+    this.selected_category = window.location.hash.replace("#","");\r
+    if (!this.selected_category) { this.selected_category = undefined };\r
+    \r
+    this.categories = this.el.find(".categories ul li");\r
+    this.orig_categories = this.categories.clone();\r
+        \r
+    //this.update_page_objects();\r
+    \r
+    this.grid_height = 251;\r
+    this.grid_width = 251;\r
+    this.grid_gap = 22;\r
+\r
+    var self = this;\r
+    $(window).bind('hashchange', function() {\r
+        self.selected_category = window.location.hash.substring(1);\r
+        self.update_page_objects();\r
+        self.update_selected_category();\r
+    })\r
+\r
+    self.update_page_objects();\r
+    self.update_selected_category();\r
+}\r
+\r
+ResourcesModule.prototype.switch = function(hide, show) {\r
+    var hide = $(hide), show = $(show);\r
+    var toparent = hide.parent();\r
+    var newshow = show.clone();\r
+    toparent.append(newshow);\r
+    hide.animate({top:"-249px"})\r
+    newshow.animate({\r
+                    top:"-249px"\r
+                }, \r
+                {\r
+                    complete:function(){\r
+                        hide.remove();\r
+                        newshow.css({top:0});\r
+                }\r
+    })\r
+}\r
+\r
+\r
+ResourcesModule.prototype.resources = function() {\r
+    this._resources  = this.el.find(".resource-wrapper");\r
+    return this._resources;\r
+}\r
+\r
+ResourcesModule.prototype.hide = function(q) {\r
+    q.fadeOut(300);\r
+}\r
+\r
+ResourcesModule.prototype.animate_els = function(els) {\r
+    $(el).css({ position:'absolute' });\r
+    var left = i % 3 == 0 ? 0 : (i % 3) * (self.grid_width) + ((i % 3)-1) * self.grid_gap;\r
+\r
+    var row = Math.floor(i/3);\r
+    var top = row * (self.grid_gap + self.grid_height);\r
+\r
+    $(el).animate({left: left}, { complete: function(){\r
+        $(el).animate({top: top}, {complete: function(){\r
+        \r
+            self.el.height((self.grid_height + self.grid_gap) * (Math.floor(to_show.length/3) + 1));\r
+        \r
+        }});\r
+    }});\r
+     \r
+    $(el).removeClass("hidden");\r
+    $(el).show('slow');\r
+}\r
+\r
+ResourcesModule.prototype.update_selected_category = function() {\r
+    if (!this.selected_category) {\r
+        this.categories.removeClass("inactive").removeClass("active");\r
+        this.categories.show();\r
+        this.el.find(".categories a.clear").hide();\r
+        return;\r
+    }\r
+\r
+    var to_hide = this.categories.filter("[data-id="+this.selected_category+"]");\r
+    var to_show = this.categories.filter("[data-id!="+this.selected_category+"]");\r
+\r
+    to_show.removeClass("active").addClass("inactive");\r
+    to_hide.removeClass("inactive").addClass("active");\r
+    this.el.find(".categories a.clear").show();\r
+}\r
+\r
+ResourcesModule.prototype.update_page_objects = function() {\r
+    var to_show = this.resources().filter("[data-category="+this.selected_category+"]");\r
+    var to_hide = this.resources().filter("[data-category!="+this.selected_category+"]");\r
+        \r
+    if (!this.selected_category) { to_show = this.resources(); }\r
+    _.each(to_hide, function(el){\r
+        $(el).hide('slow');\r
+    });\r
+\r
+    _.each(to_show, function(el, i){\r
+         \r
+        $(el).fadeIn(40);\r
+    });\r
+}\r
+\r
+$(document).ready(function(){\r
+    var rm = new ResourcesModule($("#resources-list"), {}, []);\r
+    window.rm = rm;\r
+})\r
+\r
+\r
diff --git a/snf-astakos-app/astakos/im/static/im/js/underscore.js b/snf-astakos-app/astakos/im/static/im/js/underscore.js
new file mode 100644 (file)
index 0000000..f6f7e2f
--- /dev/null
@@ -0,0 +1,1059 @@
+//     Underscore.js 1.3.3
+//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+//     Underscore is freely distributable under the MIT license.
+//     Portions of Underscore are inspired or borrowed from Prototype,
+//     Oliver Steele's Functional, and John Resig's Micro-Templating.
+//     For all details and documentation:
+//     http://documentcloud.github.com/underscore
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `global` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Establish the object that gets returned to break out of a loop iteration.
+  var breaker = {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var slice            = ArrayProto.slice,
+      unshift          = ArrayProto.unshift,
+      toString         = ObjProto.toString,
+      hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeForEach      = ArrayProto.forEach,
+    nativeMap          = ArrayProto.map,
+    nativeReduce       = ArrayProto.reduce,
+    nativeReduceRight  = ArrayProto.reduceRight,
+    nativeFilter       = ArrayProto.filter,
+    nativeEvery        = ArrayProto.every,
+    nativeSome         = ArrayProto.some,
+    nativeIndexOf      = ArrayProto.indexOf,
+    nativeLastIndexOf  = ArrayProto.lastIndexOf,
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind;
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) { return new wrapper(obj); };
+
+  // Export the Underscore object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, add `_` as a global object via a string identifier,
+  // for Closure Compiler "advanced" mode.
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      exports = module.exports = _;
+    }
+    exports._ = _;
+  } else {
+    root['_'] = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.3.3';
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles objects with the built-in `forEach`, arrays, and raw objects.
+  // Delegates to **ECMAScript 5**'s native `forEach` if available.
+  var each = _.each = _.forEach = function(obj, iterator, context) {
+    if (obj == null) return;
+    if (nativeForEach && obj.forEach === nativeForEach) {
+      obj.forEach(iterator, context);
+    } else if (obj.length === +obj.length) {
+      for (var i = 0, l = obj.length; i < l; i++) {
+        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
+      }
+    } else {
+      for (var key in obj) {
+        if (_.has(obj, key)) {
+          if (iterator.call(context, obj[key], key, obj) === breaker) return;
+        }
+      }
+    }
+  };
+
+  // Return the results of applying the iterator to each element.
+  // Delegates to **ECMAScript 5**'s native `map` if available.
+  _.map = _.collect = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+    each(obj, function(value, index, list) {
+      results[results.length] = iterator.call(context, value, index, list);
+    });
+    if (obj.length === +obj.length) results.length = obj.length;
+    return results;
+  };
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduce && obj.reduce === nativeReduce) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+    }
+    each(obj, function(value, index, list) {
+      if (!initial) {
+        memo = value;
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, value, index, list);
+      }
+    });
+    if (!initial) throw new TypeError('Reduce of empty array with no initial value');
+    return memo;
+  };
+
+  // The right-associative version of reduce, also known as `foldr`.
+  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+    }
+    var reversed = _.toArray(obj).reverse();
+    if (context && !initial) iterator = _.bind(iterator, context);
+    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
+  };
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, iterator, context) {
+    var result;
+    any(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) {
+        result = value;
+        return true;
+      }
+    });
+    return result;
+  };
+
+  // Return all the elements that pass a truth test.
+  // Delegates to **ECMAScript 5**'s native `filter` if available.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+    each(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) results[results.length] = value;
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    each(obj, function(value, index, list) {
+      if (!iterator.call(context, value, index, list)) results[results.length] = value;
+    });
+    return results;
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Delegates to **ECMAScript 5**'s native `every` if available.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, iterator, context) {
+    var result = true;
+    if (obj == null) return result;
+    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+    each(obj, function(value, index, list) {
+      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Delegates to **ECMAScript 5**'s native `some` if available.
+  // Aliased as `any`.
+  var any = _.some = _.any = function(obj, iterator, context) {
+    iterator || (iterator = _.identity);
+    var result = false;
+    if (obj == null) return result;
+    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+    each(obj, function(value, index, list) {
+      if (result || (result = iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if a given value is included in the array or object using `===`.
+  // Aliased as `contains`.
+  _.include = _.contains = function(obj, target) {
+    var found = false;
+    if (obj == null) return found;
+    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+    found = any(obj, function(value) {
+      return value === target;
+    });
+    return found;
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    return _.map(obj, function(value) {
+      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, function(value){ return value[key]; });
+  };
+
+  // Return the maximum element or (element-based computation).
+  _.max = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.max.apply(Math, obj);
+    if (!iterator && _.isEmpty(obj)) return -Infinity;
+    var result = {computed : -Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed >= result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.min.apply(Math, obj);
+    if (!iterator && _.isEmpty(obj)) return Infinity;
+    var result = {computed : Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed < result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Shuffle an array.
+  _.shuffle = function(obj) {
+    var shuffled = [], rand;
+    each(obj, function(value, index, list) {
+      rand = Math.floor(Math.random() * (index + 1));
+      shuffled[index] = shuffled[rand];
+      shuffled[rand] = value;
+    });
+    return shuffled;
+  };
+
+  // Sort the object's values by a criterion produced by an iterator.
+  _.sortBy = function(obj, val, context) {
+    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value : value,
+        criteria : iterator.call(context, value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      if (a === void 0) return 1;
+      if (b === void 0) return -1;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }), 'value');
+  };
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  _.groupBy = function(obj, val) {
+    var result = {};
+    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
+    each(obj, function(value, index) {
+      var key = iterator(value, index);
+      (result[key] || (result[key] = [])).push(value);
+    });
+    return result;
+  };
+
+  // Use a comparator function to figure out at what index an object should
+  // be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iterator) {
+    iterator || (iterator = _.identity);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = (low + high) >> 1;
+      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
+    }
+    return low;
+  };
+
+  // Safely convert anything iterable into a real, live array.
+  _.toArray = function(obj) {
+    if (!obj)                                     return [];
+    if (_.isArray(obj))                           return slice.call(obj);
+    if (_.isArguments(obj))                       return slice.call(obj);
+    if (obj.toArray && _.isFunction(obj.toArray)) return obj.toArray();
+    return _.values(obj);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    return _.isArray(obj) ? obj.length : _.keys(obj).length;
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head` and `take`. The **guard** check
+  // allows it to work with `_.map`.
+  _.first = _.head = _.take = function(array, n, guard) {
+    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+  };
+
+  // Returns everything but the last entry of the array. Especcialy useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N. The **guard** check allows it to work with
+  // `_.map`.
+  _.initial = function(array, n, guard) {
+    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+  };
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  _.last = function(array, n, guard) {
+    if ((n != null) && !guard) {
+      return slice.call(array, Math.max(array.length - n, 0));
+    } else {
+      return array[array.length - 1];
+    }
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail`.
+  // Especially useful on the arguments object. Passing an **index** will return
+  // the rest of the values in the array from that index onward. The **guard**
+  // check allows it to work with `_.map`.
+  _.rest = _.tail = function(array, index, guard) {
+    return slice.call(array, (index == null) || guard ? 1 : index);
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, function(value){ return !!value; });
+  };
+
+  // Return a completely flattened version of an array.
+  _.flatten = function(array, shallow) {
+    return _.reduce(array, function(memo, value) {
+      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
+      memo[memo.length] = value;
+      return memo;
+    }, []);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted, iterator) {
+    var initial = iterator ? _.map(array, iterator) : array;
+    var results = [];
+    // The `isSorted` flag is irrelevant if the array only contains two elements.
+    if (array.length < 3) isSorted = true;
+    _.reduce(initial, function (memo, value, index) {
+      if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {
+        memo.push(value);
+        results.push(array[index]);
+      }
+      return memo;
+    }, []);
+    return results;
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(_.flatten(arguments, true));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays. (Aliased as "intersect" for back-compat.)
+  _.intersection = _.intersect = function(array) {
+    var rest = slice.call(arguments, 1);
+    return _.filter(_.uniq(array), function(item) {
+      return _.every(rest, function(other) {
+        return _.indexOf(other, item) >= 0;
+      });
+    });
+  };
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array) {
+    var rest = _.flatten(slice.call(arguments, 1), true);
+    return _.filter(array, function(value){ return !_.include(rest, value); });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function() {
+    var args = slice.call(arguments);
+    var length = _.max(_.pluck(args, 'length'));
+    var results = new Array(length);
+    for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
+    return results;
+  };
+
+  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+  // we need this function. Return the position of the first occurrence of an
+  // item in an array, or -1 if the item is not included in the array.
+  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = function(array, item, isSorted) {
+    if (array == null) return -1;
+    var i, l;
+    if (isSorted) {
+      i = _.sortedIndex(array, item);
+      return array[i] === item ? i : -1;
+    }
+    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
+    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
+    return -1;
+  };
+
+  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+  _.lastIndexOf = function(array, item) {
+    if (array == null) return -1;
+    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
+    var i = array.length;
+    while (i--) if (i in array && array[i] === item) return i;
+    return -1;
+  };
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = arguments[2] || 1;
+
+    var len = Math.max(Math.ceil((stop - start) / step), 0);
+    var idx = 0;
+    var range = new Array(len);
+
+    while(idx < len) {
+      range[idx++] = start;
+      start += step;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Reusable constructor function for prototype setting.
+  var ctor = function(){};
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Binding with arguments is also known as `curry`.
+  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
+  // We check for `func.bind` first, to fail fast when `func` is undefined.
+  _.bind = function bind(func, context) {
+    var bound, args;
+    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    if (!_.isFunction(func)) throw new TypeError;
+    args = slice.call(arguments, 2);
+    return bound = function() {
+      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
+      ctor.prototype = func.prototype;
+      var self = new ctor;
+      var result = func.apply(self, args.concat(slice.call(arguments)));
+      if (Object(result) === result) return result;
+      return self;
+    };
+  };
+
+  // Bind all of an object's methods to that object. Useful for ensuring that
+  // all callbacks defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var funcs = slice.call(arguments, 1);
+    if (funcs.length == 0) funcs = _.functions(obj);
+    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memo = {};
+    hasher || (hasher = _.identity);
+    return function() {
+      var key = hasher.apply(this, arguments);
+      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+    };
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){ return func.apply(null, args); }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = function(func) {
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+  };
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time.
+  _.throttle = function(func, wait) {
+    var context, args, timeout, throttling, more, result;
+    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
+    return function() {
+      context = this; args = arguments;
+      var later = function() {
+        timeout = null;
+        if (more) func.apply(context, args);
+        whenDone();
+      };
+      if (!timeout) timeout = setTimeout(later, wait);
+      if (throttling) {
+        more = true;
+      } else {
+        result = func.apply(context, args);
+      }
+      whenDone();
+      throttling = true;
+      return result;
+    };
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds. If `immediate` is passed, trigger the function on the
+  // leading edge, instead of the trailing.
+  _.debounce = function(func, wait, immediate) {
+    var timeout;
+    return function() {
+      var context = this, args = arguments;
+      var later = function() {
+        timeout = null;
+        if (!immediate) func.apply(context, args);
+      };
+      if (immediate && !timeout) func.apply(context, args);
+      clearTimeout(timeout);
+      timeout = setTimeout(later, wait);
+    };
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = function(func) {
+    var ran = false, memo;
+    return function() {
+      if (ran) return memo;
+      ran = true;
+      return memo = func.apply(this, arguments);
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return function() {
+      var args = [func].concat(slice.call(arguments, 0));
+      return wrapper.apply(this, args);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var funcs = arguments;
+    return function() {
+      var args = arguments;
+      for (var i = funcs.length - 1; i >= 0; i--) {
+        args = [funcs[i].apply(this, args)];
+      }
+      return args[0];
+    };
+  };
+
+  // Returns a function that will only be executed after being called N times.
+  _.after = function(times, func) {
+    if (times <= 0) return func();
+    return function() {
+      if (--times < 1) { return func.apply(this, arguments); }
+    };
+  };
+
+  // Object Functions
+  // ----------------
+
+  // Retrieve the names of an object's properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = nativeKeys || function(obj) {
+    if (obj !== Object(obj)) throw new TypeError('Invalid object');
+    var keys = [];
+    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    return _.map(obj, _.identity);
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      for (var prop in source) {
+        obj[prop] = source[prop];
+      }
+    });
+    return obj;
+  };
+
+  // Return a copy of the object only containing the whitelisted properties.
+  _.pick = function(obj) {
+    var result = {};
+    each(_.flatten(slice.call(arguments, 1)), function(key) {
+      if (key in obj) result[key] = obj[key];
+    });
+    return result;
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      for (var prop in source) {
+        if (obj[prop] == null) obj[prop] = source[prop];
+      }
+    });
+    return obj;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Internal recursive comparison function.
+  function eq(a, b, stack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
+    if (a === b) return a !== 0 || 1 / a == 1 / b;
+    // A strict comparison is necessary because `null == undefined`.
+    if (a == null || b == null) return a === b;
+    // Unwrap any wrapped objects.
+    if (a._chain) a = a._wrapped;
+    if (b._chain) b = b._wrapped;
+    // Invoke a custom `isEqual` method if one is provided.
+    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
+    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className != toString.call(b)) return false;
+    switch (className) {
+      // Strings, numbers, dates, and booleans are compared by value.
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return a == String(b);
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+        // other numeric values.
+        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a == +b;
+      // RegExps are compared by their source patterns and flags.
+      case '[object RegExp]':
+        return a.source == b.source &&
+               a.global == b.global &&
+               a.multiline == b.multiline &&
+               a.ignoreCase == b.ignoreCase;
+    }
+    if (typeof a != 'object' || typeof b != 'object') return false;
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+    var length = stack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (stack[length] == a) return true;
+    }
+    // Add the first object to the stack of traversed objects.
+    stack.push(a);
+    var size = 0, result = true;
+    // Recursively compare objects and arrays.
+    if (className == '[object Array]') {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      size = a.length;
+      result = size == b.length;
+      if (result) {
+        // Deep compare the contents, ignoring non-numeric properties.
+        while (size--) {
+          // Ensure commutative equality for sparse arrays.
+          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
+        }
+      }
+    } else {
+      // Objects with different constructors are not equivalent.
+      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
+      // Deep compare objects.
+      for (var key in a) {
+        if (_.has(a, key)) {
+          // Count the expected number of properties.
+          size++;
+          // Deep compare each member.
+          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
+        }
+      }
+      // Ensure that both objects contain the same number of properties.
+      if (result) {
+        for (key in b) {
+          if (_.has(b, key) && !(size--)) break;
+        }
+        result = !size;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    stack.pop();
+    return result;
+  }
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    return eq(a, b, []);
+  };
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  _.isEmpty = function(obj) {
+    if (obj == null) return true;
+    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+    for (var key in obj) if (_.has(obj, key)) return false;
+    return true;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType == 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) == '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    return obj === Object(obj);
+  };
+
+  // Is a given variable an arguments object?
+  _.isArguments = function(obj) {
+    return toString.call(obj) == '[object Arguments]';
+  };
+  if (!_.isArguments(arguments)) {
+    _.isArguments = function(obj) {
+      return !!(obj && _.has(obj, 'callee'));
+    };
+  }
+
+  // Is a given value a function?
+  _.isFunction = function(obj) {
+    return toString.call(obj) == '[object Function]';
+  };
+
+  // Is a given value a string?
+  _.isString = function(obj) {
+    return toString.call(obj) == '[object String]';
+  };
+
+  // Is a given value a number?
+  _.isNumber = function(obj) {
+    return toString.call(obj) == '[object Number]';
+  };
+
+  // Is a given object a finite number?
+  _.isFinite = function(obj) {
+    return _.isNumber(obj) && isFinite(obj);
+  };
+
+  // Is the given value `NaN`?
+  _.isNaN = function(obj) {
+    // `NaN` is the only value for which `===` is not reflexive.
+    return obj !== obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+  };
+
+  // Is a given value a date?
+  _.isDate = function(obj) {
+    return toString.call(obj) == '[object Date]';
+  };
+
+  // Is the given value a regular expression?
+  _.isRegExp = function(obj) {
+    return toString.call(obj) == '[object RegExp]';
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Has own property?
+  _.has = function(obj, key) {
+    return hasOwnProperty.call(obj, key);
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iterators.
+  _.identity = function(value) {
+    return value;
+  };
+
+  // Run a function **n** times.
+  _.times = function (n, iterator, context) {
+    for (var i = 0; i < n; i++) iterator.call(context, i);
+  };
+
+  // Escape a string for HTML interpolation.
+  _.escape = function(string) {
+    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
+  };
+
+  // If the value of the named property is a function then invoke it;
+  // otherwise, return it.
+  _.result = function(object, property) {
+    if (object == null) return null;
+    var value = object[property];
+    return _.isFunction(value) ? value.call(object) : value;
+  };
+
+  // Add your own custom functions to the Underscore object, ensuring that
+  // they're correctly added to the OOP wrapper as well.
+  _.mixin = function(obj) {
+    each(_.functions(obj), function(name){
+      addToWrapper(name, _[name] = obj[name]);
+    });
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = idCounter++;
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g,
+    escape      : /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /.^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    '\\': '\\',
+    "'": "'",
+    'r': '\r',
+    'n': '\n',
+    't': '\t',
+    'u2028': '\u2028',
+    'u2029': '\u2029'
+  };
+
+  for (var p in escapes) escapes[escapes[p]] = p;
+  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+  var unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g;
+
+  // Within an interpolation, evaluation, or escaping, remove HTML escaping
+  // that had been previously added.
+  var unescape = function(code) {
+    return code.replace(unescaper, function(match, escape) {
+      return escapes[escape];
+    });
+  };
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  _.template = function(text, data, settings) {
+    settings = _.defaults(settings || {}, _.templateSettings);
+
+    // Compile the template source, taking care to escape characters that
+    // cannot be included in a string literal and then unescape them in code
+    // blocks.
+    var source = "__p+='" + text
+      .replace(escaper, function(match) {
+        return '\\' + escapes[match];
+      })
+      .replace(settings.escape || noMatch, function(match, code) {
+        return "'+\n_.escape(" + unescape(code) + ")+\n'";
+      })
+      .replace(settings.interpolate || noMatch, function(match, code) {
+        return "'+\n(" + unescape(code) + ")+\n'";
+      })
+      .replace(settings.evaluate || noMatch, function(match, code) {
+        return "';\n" + unescape(code) + "\n;__p+='";
+      }) + "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __p='';" +
+      "var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" +
+      source + "return __p;\n";
+
+    var render = new Function(settings.variable || 'obj', '_', source);
+    if (data) return render(data, _);
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled function source as a convenience for build time
+    // precompilation.
+    template.source = 'function(' + (settings.variable || 'obj') + '){\n' +
+      source + '}';
+
+    return template;
+  };
+
+  // Add a "chain" function, which will delegate to the wrapper.
+  _.chain = function(obj) {
+    return _(obj).chain();
+  };
+
+  // The OOP Wrapper
+  // ---------------
+
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+  var wrapper = function(obj) { this._wrapped = obj; };
+
+  // Expose `wrapper.prototype` as `_.prototype`
+  _.prototype = wrapper.prototype;
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(obj, chain) {
+    return chain ? _(obj).chain() : obj;
+  };
+
+  // A method to easily add functions to the OOP wrapper.
+  var addToWrapper = function(name, func) {
+    wrapper.prototype[name] = function() {
+      var args = slice.call(arguments);
+      unshift.call(args, this._wrapped);
+      return result(func.apply(_, args), this._chain);
+    };
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    wrapper.prototype[name] = function() {
+      var wrapped = this._wrapped;
+      method.apply(wrapped, arguments);
+      var length = wrapped.length;
+      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
+      return result(wrapped, this._chain);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    wrapper.prototype[name] = function() {
+      return result(method.apply(this._wrapped, arguments), this._chain);
+    };
+  });
+
+  // Start chaining a wrapped Underscore object.
+  wrapper.prototype.chain = function() {
+    this._chain = true;
+    return this;
+  };
+
+  // Extracts the result from a wrapped and chained object.
+  wrapper.prototype.value = function() {
+    return this._wrapped;
+  };
+
+}).call(this);
index 98ceb36..52aa1b7 100644 (file)
@@ -1,4 +1,4 @@
-{% extends "im/base_two_cols.html" %}
+{% extends "im/base.html" %}
 
 {% load filters %}
 
 
 {% block page.nav.items %}
     {% for item in menu%}
-        <li class="{% if item|lookup:"is_active" %}active{% endif %}">
+        <li {% if item|lookup:"is_active" %}class="active"{% endif %}>
             <a href="{{ item|lookup:"url" }}">{{ item|lookup:"name" }}</a>
         </li>
     {% endfor %}
 {% endblock %}
     
 {% block page.body %}
-<div class="maincol {% block innerpage.class %}full{% endblock %}">
+<div class="{% block innerpage.class %}full{% endblock %}">
 {% block body %}{% endblock %}
 
     {% if PROFILE_EXTRA_LINKS %}
-    <div class="extra-buttons buttons-list fixpos">
+    <div class="buttons-list fixpos">
         {% for href, name in PROFILE_EXTRA_LINKS.items %}
             <a class="button back right" href="{{ href }}">{{ name }}</a>
         {% endfor %}
     </div>
     {% endif %}
+    
 
 </div>
 
 {% endblock %}
\ No newline at end of file
index ba5f5b1..12d6ea1 100644 (file)
@@ -1,8 +1,4 @@
 <!doctype html>
-<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
-<!--[if IE 7 ]>    <html lang="en" class="no-js ie7"> <![endif]-->
-<!--[if IE 8 ]>    <html lang="en" class="no-js ie8"> <![endif]-->
-<!--[if (gte IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
 <head>
   {% block starthead %}{% endblock starthead %}
   <meta charset="UTF-8">
   {% endblock page.favicons %}
 
   {% block page.css %}
-      <link href='https://fonts.googleapis.com/css?family=Antic' 
-        rel='stylesheet' type='text/css'>
-      <link rel="stylesheet" href="{{ IM_STATIC_URL }}css/styles.css" 
-        type='text/css'>
-      <link rel="stylesheet" href="{{ IM_STATIC_URL }}css/custom.css" 
-      type='text/css'>
+       
+      <link href="https://fonts.googleapis.com/css?family=Antic" rel="stylesheet" type="text/css">
+      <link rel="stylesheet" type="text/css" href="{{ IM_STATIC_URL }}css/global.css">
       <!--[if lte IE 7]>
-            <link rel="stylesheet" type="text/css" 
-            href="{{ IM_STATIC_URL }}im/css/ie7.css">
+            <link rel="stylesheet" type="text/css" href="{{ IM_STATIC_URL }}im/css/ie7.css">
       <![endif]-->
   {% endblock page.css %}
 
   {% block headjs %}
-      <script src="{{ IM_STATIC_URL }}js/modernizr-2.0.6.js"
-          type="text/javascript"></script>
-      <script src="{{ IM_STATIC_URL }}js/jquery.js" 
-          type="text/javascript"></script>
-      <script src="{{ IM_STATIC_URL }}js/jquery.infieldlabel.js" 
-          type="text/javascript"></script>
-      <script src="{{ IM_STATIC_URL }}js/forms.js" 
-          type="text/javascript"></script>
+         <script src="{{ IM_STATIC_URL }}js/jquery-1.7.1.min.js"></script>     
+         <script src="{{ IM_STATIC_URL }}js/jquery.dropkick-1.0.0.js"></script>
+         <script src="{{ IM_STATIC_URL }}js/os.js"></script>   
+      <script src="{{ IM_STATIC_URL }}js/modernizr-2.0.6.js"></script> 
+      <script src="{{ IM_STATIC_URL }}js/jquery.js"></script>  
+      <script src="{{ IM_STATIC_URL }}js/jquery.infieldlabel.js"></script>     
+      <script src="{{ IM_STATIC_URL }}js/forms.js"></script>   
+      <script src="{{ IM_STATIC_URL }}js/common.js"></script>
   {% endblock headjs %}
   {% block endhead %}{% endblock endhead %}
 
 </head>
 
 <body>
-    <div class='container'>
-        <div class='header'>
-            <div class="mainlogo">
-                <h1>accounts</h1>
-            </div>
-            
+    <div class="container">
+           <div class="wrapper">       
+               {% if messages or LOGIN_MESSAGES %}
+               <div class="top-msg active">
+                   {% block extra_messages %}{% endblock %}
+                   {% for message in messages %}
+                   <div{% if message.tags %} 
+                       class="{{ message.tags }}"{% endif %}>
+                       {{ message|safe }}</div>
+                   {% endfor %}
+                   <a href="#" title="close" class="close">X</a>
+               </div>
+               {% endif %}
+               <h1><img src="../static/im/images/accounts-logo.png" alt="accounts" /></h1>
             {% block page.nav %}
             <div class="navigation">
-            <ul class="mainnav inline">
-                {% block page.nav.items %}
-                {% endblock %}
-            </ul>
-            <ul class="mainnav inline subnav">
-                {% block page.subnav %}{%endblock %}
-            </ul>
+                   <ul>
+                       {% block page.nav.items %}
+                       {% endblock %}
+                   </ul>
+                   <ul>
+                       {% block page.subnav %}{%endblock %}
+                   </ul>
             </div>
             {% endblock %}
-        </div>
-        {% if messages or LOGIN_MESSAGES %}
-        <ul class="messages">
-            {% block extra_messages %}{% endblock %}
-            {% for message in messages %}
-            <li{% if message.tags %} 
-                class="{{ message.tags }}"{% endif %}>
-                {{ message }}</li>
-            {% endfor %}
-        </ul>
-        {% endif %}
-        <div class="page">
-            {% block page.body %}
-                <div class="maincol full">
-                    {% block body %}
-                    {% endblock %}
-                </div>
-            {% endblock %}
+                
+               
+               <div class="content">
+                   {% block page.body %}
+                       <div class="full">
+                           {% block body %}
+                           {% endblock %}
+                       </div>
+                   {% endblock %}
+               </div>
+          </div>
+    </div>
+    <div class="footer">
+        <div class="wrapper">
+               {% include "im/footer.html" %}
         </div>
     </div>
-    {% include "im/footer.html" %}
+    
 </body>
 </html>
index dedec7c..5dc3cd1 100644 (file)
@@ -1,12 +1,14 @@
 {% extends "im/base.html" %}
 
 {% block page.body %}
-<div class="maincol">
-    {% block body %}
-    {% endblock %}
-</div>
-<div class="rightcol">
-    {% block body.right %}
-    {% endblock %}
+<div class="two-cols clearfix">
+       <div class="rt">
+           {% block body.right %}
+           {% endblock %}
+       </div>
+       <div class="lt">
+           {% block body.left %}
+           {% endblock %}
+       </div>
 </div>
 {% endblock %}
index fc512e0..6a23e36 100644 (file)
@@ -11,7 +11,7 @@
     <div class="form-row submit">
         <input type="hidden" name="next" value="{{ next }}">
         <input type="hidden" name="auth" value="{{ user.auth_token }}">
-    <input type="hidden" name="username" value="{{ username }}">
+       <input type="hidden" name="username" value="{{ username }}">
         <input type="submit" class="submit altcol" value="SEND" />
     </div>
   
index c4f148d..81345ff 100644 (file)
@@ -1,9 +1,8 @@
-<div class="footer">
-    {% block footer_content %}
-    <div class="last row clearme">
-        Copyright 2011-2012 <a href="http://www.grnet.gr" alt="GRNET S.A.">GRNET S.A.</a> All rights reserved.
-        <div class="termslink" style="float:right"><a href="{% url latest_terms %}">Terms of use</a></div>
-    </div>
-    {% endblock %}
+{% block footer_content %}
+<div class="clearfix">
+    <p class="termslink" style="float:right"><a href="{% url latest_terms %}">Terms of use</a></p>
+    <p>Copyright 2011-2012 <a href="http://www.grnet.gr" alt="GRNET S.A.">GRNET S.A.</a> All rights reserved.</li></p>
 </div>
+{% endblock %}
 
index 0c63d01..2119187 100644 (file)
      <p class="{% if field.blank %}required{% endif %}">
         {{ field.label_tag }}
         {{ field|safe }}
-        </p>
-    </div>
+        {%  if field.help_text %}
+               <span class="info"> 
+                           <em>more info</em>
+                           <span>{{ field.help_text|safe }}</span>
+                   </span>
+        {% endif %}
+     </p>
+</div>
 {% endfor %}
index 5d75ef3..31ff8d3 100644 (file)
@@ -1,48 +1,50 @@
 {% extends "im/account_base.html" %}
 
 {% block page.body %}
-<div class="maincol {% block innerpage.class %}{% endblock %}">
-    <div class="section">
-        <h2>You have <em>{{ inviter.invitations }}</em> invitation{{ inviter.invitations|pluralize }} left.</h2>
-        {% if sent|length %}
-          <table class="zebra-striped id-sorted">
-            <thead>
-              <tr>
-                <th>Email</th>
-                <th>Real Name</th>
-                <th>Used</th>
-              </tr>
-            </thead>
-            <tbody>
-              {% for inv in sent %}
-              <tr class="{% if inv.is_consumed %}used{% endif %}">
-                <td>{{ inv.email }}</td>
-                <td>{{ inv.realname }}</td>
-                <td class="consumed">{% if inv.is_consumed %}Yes{% else %}No{% endif %}</td>
-              </tr>
-              {% endfor %}
-            </tbody>
-        </table>
-        {% else %}
-            <p>No invitations sent</p>
-        {% endif %}
-    </div>
+<div class="two-cols clearfix">
+       <div class="rt">
+        {% if inviter.invitations %}
+         <form action="{% url astakos.im.views.invite %}" method="post"
+           class="innerlabels">{% csrf_token %}
+           <h2>INVITE SOMEONE ELSE</h2>
+           {% with invitation_form as form %}
+           {% include "im/form_render.html" %}
+           {% endwith %}
+       
+           <div class="form-row submit">
+               <input type="submit" class="submit altcol" value="SEND" />
+           </div>
+         </form>
+         {% endif %}
+       </div>
+       <div class="lt {% block innerpage.class %}{% endblock %}">
+           
+           <h2>You have <em>{{ inviter.invitations }}</em> invitation{{ inviter.invitations|pluralize }} left.</h2>
+           {% if sent|length %}
+             <table class="zebra-striped id-sorted">
+               <thead>
+                 <tr>
+                   <th>Email</th>
+                   <th>Real Name</th>
+                   <th>Used</th>
+                 </tr>
+               </thead>
+               <tbody>
+                 {% for inv in sent %}
+                 <tr class="{% if inv.is_consumed %}used{% endif %}">
+                   <td>{{ inv.email }}</td>
+                   <td>{{ inv.realname }}</td>
+                   <td class="consumed">{% if inv.is_consumed %}Yes{% else %}No{% endif %}</td>
+                 </tr>
+                 {% endfor %}
+               </tbody>
+           </table>
+           {% else %}
+               <p>No invitations sent</p>
+           {% endif %}
+       </div>     
 </div>
 
-<div class="rightcol">
- {% if inviter.invitations %}
-  <form action="{% url astakos.im.views.invite %}" method="post"
-    class="innerlabels">{% csrf_token %}
-    <h2>INVITE SOMEONE ELSE</h2>
-    {% with invitation_form as form %}
-    {% include "im/form_render.html" %}
-    {% endwith %}
 
-    <div class="form-row submit">
-        <input type="submit" class="submit altcol" value="SEND" />
-    </div>
-  </form>
-  {% endif %}
-</div>
 {% endblock %}
 
index 227fc12..e394309 100644 (file)
@@ -9,57 +9,50 @@
 {% endblock %}
 
 {% block signup_class %}hidden{% endblock %}
-{% block page.title %}
-Login
-{% endblock %}
+{% block page.title %}{% endblock %}
 
-{% block body %}
-<div class="section">
-    <img class="pic" src="{{ IM_STATIC_URL }}images/pictures/login_pic.png" />
-</div>
-{% comment %}{% include "im/services_description.html" %}{% endcomment %}
-{% endblock body %}
+{% block body.left %}
+       <img class="pic" src="{{ IM_STATIC_URL }}images/porta.png" />
+       {% comment %}{% include "im/services_description.html" %}{% endcomment %}
+{% endblock body.left %}
     
-{% block body.right %}
-<div class="section">
-     {% if "local" in im_modules %}
-        <form action="{% url astakos.im.target.local.login %}" method="post"
-            class="login innerlabels">{% csrf_token %}
-            <h2 class="formheader"><span>LOGIN</span></h2>
-            {% with login_form as form %}
-            {% include "im/form_render.html" %}
-            {% endwith %}
-            <input type="hidden" name="next" value="{{ next }}">
-            <div class="form-row submit">
-                <input type="submit" class="submit altcol" value="SUBMIT" />
-                <a class="extra-link" href="{% url django.contrib.auth.views.password_reset %}">Forgot your password?</a>
-            </div>
-        </form>
-      {% endif %}
+{% block body.right %} 
+       {% if "local" in im_modules %}
+       <form action="{% url astakos.im.target.local.login %}" method="post"class="login innerlabels">{% csrf_token %}
+                   <h2>LOGIN</h2>
+                   {% with login_form as form %}
+                       {% include "im/form_render.html" %}
+                   {% endwith %}
+                   <input type="hidden" name="next" value="{{ next }}">
+                   <div class="form-row submit">
+                       <input type="submit" class="submit altcol" value="SUBMIT" />
+                       <a class="extra-link" href="{% url django.contrib.auth.views.password_reset %}">Forgot your password?</a>
+                   </div>
+       </form>
+    {% endif %}
 
-          <div class="extralogin">
-              {% for o in im_modules %}
-              <div>
-            {% if o != 'local' %}
-            LOGIN using
-            <a href="/im/login/{{ o }}{% ifnotequal next "" %}&next={{ next|urlencode }}{% endifnotequal %}{% ifnotequal code ""%}{% if next != "" %}&{% else %}?{% endif %}code={{ code }}{% endifnotequal %}"
-                alt="{{ o|title }}">{{ o }}</a>
-            {% endif %}
-            </div>
-            {% endfor %}
+    <div class="extralogin">
+         {% for o in im_modules %}
+       <div>
+        {% if o != 'local' %}
+        LOGIN using
+               <a href="/im/login/{{ o }}{% ifnotequal next "" %}&next={{ next|urlencode }}{% endifnotequal %}{% ifnotequal code ""%}{% if next != "" %}&{% else %}?{% endif %}code={{ code }}{% endifnotequal %}"
+            alt="{{ o|title }}">{{ o }}</a>
+        {% endif %}
         </div>
-        {% block body.signup %}
-        {% for o in im_modules %}
-            {% if o != 'local' %}
-            <br />
-            {% endif %}
         {% endfor %}
-        <div class="bottom">
-            {% block body.login.signup %}
-                new to okeanos ? <a href="{% url astakos.im.views.signup %}{% ifnotequal code "" %}?code={{ code|urlencode }}{% endifnotequal %}">CREATE ACCOUNT</a>
-            {% endblock %}
-            </div>
-        </div>
-        {% endblock %}
     </div>
-{% endblock %}
+    {% block body.signup %}
+           {% for o in im_modules %}
+               {% if o != 'local' %}
+               <br />
+               {% endif %}
+           {% endfor %}
+           <div class="bottom">
+               {% block body.login.signup %}
+                   new to okeanos ? <a href="{% url astakos.im.views.signup %}{% ifnotequal code "" %}?code={{ code|urlencode }}{% endifnotequal %}">CREATE ACCOUNT</a>
+               {% endblock %}
+           </div>
+       {% endblock body.signup %}
+{% endblock body.right%}
index ffc0651..277a7e3 100644 (file)
@@ -2,8 +2,7 @@
 
 {% block body %}
 
-<form action={%url astakos.im.views.edit_profile %} method="post"
-    class="withlabels">{% csrf_token %}
+<form action={%url astakos.im.views.edit_profile %} method="post" class="withlabels">{% csrf_token %}
     
     {% with profile_form as form %}
     {% include "im/form_render.html" %}
index c5e5a0a..a2252dd 100644 (file)
@@ -5,12 +5,10 @@
     Signup
 {% endblock %}
 
-{% block body %}
-<div class="section">
+{% block body.left %}
     <img class="pic" src="{{ IM_STATIC_URL }}images/pictures/signup_pic.png" />
-</div>
 {% comment %}{% include "im/services_description.html" %}{% endcomment %}
-{% endblock body %}
+{% endblock body.left %}
 
 {% block body.right %}
     {% if "local" in im_modules %}
index 00cf8b5..4b7efff 100644 (file)
@@ -262,7 +262,7 @@ def edit_profile(request, template_name='im/profile.html', extra_context={}):
                 next = request.POST.get('next')
                 if next:
                     return redirect(next)
-                msg = _('Profile has been updated successfully')
+                msg = _('<p>Profile has been updated successfully</p>')
                 messages.add_message(request, messages.SUCCESS, msg)
             except ValueError, ve:
                 messages.add_message(request, messages.ERROR, ve)
@@ -415,7 +415,7 @@ def logout(request, template='registration/logged_out.html', extra_context={}):
         response['Location'] = LOGOUT_NEXT
         response.status_code = 301
         return response
-    messages.add_message(request, messages.SUCCESS, _('You have successfully logged out.'))
+    messages.add_message(request, messages.SUCCESS, _('<p>You have successfully logged out.</p>'))
     context = get_context(request, extra_context)
     response.write(render_to_string(template, context_instance=context))
     return response