diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..fadd49a Binary files /dev/null and b/.DS_Store differ diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000..240fdaa Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/admin/.DS_Store b/app/admin/.DS_Store new file mode 100644 index 0000000..30bbb79 Binary files /dev/null and b/app/admin/.DS_Store differ diff --git a/app/admin/Init.js b/app/admin/Init.js new file mode 100644 index 0000000..850333c --- /dev/null +++ b/app/admin/Init.js @@ -0,0 +1,176 @@ +(function ($, service) { + + // Local HTML helper. + var html = { + menu: function(d){ + + // Define string builder. + var sb = MVC.util.string.stringBuilder(); + + $.each(d, function(i, d){ + + if(d.items){ + + // Bild child tags. + var childItems = MVC.util.string.stringBuilder(); + + $.each(d.items, function(i, d){ + childItems.append(d.url + ' '); + }); + + sb.append('
  • ' + d.text + '
  • '); + } else { + sb.append('
  • ' + d.text + '
  • '); + } + }); + + return sb.toString(); + }, + sideMenu: function(d){ + + var sb = MVC.util.string.stringBuilder(); + + $.each(d, function(i, d){ + sb.append('
  • ' + d.text + '
  • '); + }); + + return ''; + } + }; + + var messageElm = $("#message_content"), + content = $("#content"); + + // Bind logout + $('#user_logout').click(function () { + + service.send({ + url: 'user/logout', + success: function (d) { + window.location = 'admin/login.html'; + } + }); + + return false; + }); + + // Authentizate: + service.get({ + url: 'user/getsession', + success: function (d) { + //d.isSucessful = true; + if (d.isSucessful) { + + // Set user session. + MVC.session.set('user', d.data); + + // Menu. + var menuObj = d.data.menuItems, + menuHtml = $(html.menu(menuObj)), + nav = $('#nav'), + sideNav = $('.left_nav'); + + var sideMenuObj = {}; + /**/ + $.each(menuObj, function(i, d){ + + var firstLevelChildren = d.items; + + if(firstLevelChildren){ + sideMenuObj[d.url] = firstLevelChildren; + + // Add child mapping. + $.each(firstLevelChildren, function(i, d){ + sideMenuObj[d.url] = firstLevelChildren; + }); + } + }); + + // Add top nav items. + nav.append(menuHtml); + + // Put user name in the top bar. + $('#user_profile_email').text(d.data.userName); + + content.html('

    Loading...

    '); + + // Plugin init. + content.MVC({ + rootPath: 'admin/', + viewsPath: "views/", + controllersPath: "controllers/", + routes: [ + { + name: "Default2", // Name + path: "{controller}/{action}/{p1}/{p2}/{p3}", // Path. + params: { controller: "Dash", action: "Index", p1: "1", p2: "10", p3: ""} // Defaults. + } + ], + errorMessage: "

    503 Page

    Ups, something went wrong...

    ", + start: function () { + messageElm.text("loading...").show(); + + // Show loader. + MVC.message.showLoader(); + }, + success: function (d) { + + MVC.message.hideLoader(); + + var controllerName = d.actionObject.controller, + allMenuItems = $('a', menuHtml), + currentMenuItem = $('a:[href^="#' + controllerName + '"]', menuHtml), + childMenuItemParent = $('a:[childUrls*="' + controllerName + '"]', menuHtml); + + // Remove highliting. + allMenuItems.removeClass('selected'); + + // Add highlighting. + currentMenuItem.addClass('selected'); + childMenuItemParent.addClass('selected') + + // Build side nav. + if(sideMenuObj[controllerName]){ + + var sideNavHtml = $(html.menu(sideMenuObj[controllerName])); + + sideNav.html(sideNavHtml); + + var allSideMenuItems = $('a', sideNavHtml), + currentSideMenuItem = $('a:[href^="#' + controllerName + '"]', sideNavHtml); + + // Remove highliting. + allSideMenuItems.removeClass('selected'); + + // Add highlighting. + currentSideMenuItem.addClass('selected'); + // Side nav highlighting. + + } else { + sideNav.html(''); + } + + $('#header').fadeIn(); + $('#main').fadeIn(); + + // Build side Menu. + //menuHtml = $(html.menu(menuObj)); + //sideMenu + + messageElm.hide().text(""); + }, + error: function (ex) { + + MVC.message.hideLoader(); + + messageElm.text(ex).show(); + } + }); + + } else { + //content.html('

    You are not logged in!

    '); + window.location = 'admin/login.html'; + } + } + }); +} (jQuery, MVC.service)); \ No newline at end of file diff --git a/app/admin/content/.DS_Store b/app/admin/content/.DS_Store new file mode 100644 index 0000000..e6c5d85 Binary files /dev/null and b/app/admin/content/.DS_Store differ diff --git a/app/admin/content/css/1.css b/app/admin/content/css/1.css new file mode 100644 index 0000000..32426ce --- /dev/null +++ b/app/admin/content/css/1.css @@ -0,0 +1,406 @@ +/* DEFAULTS +-----------------------------------*/ + +/* body */ +html{height: 100%;} +body {height: 100%; font-family: Arial; text-align:left; margin: 0; padding:0; color:#424242; font-size:12px; margin-top:0px; } + +/* text */ +p, h1, h2, h3, h4, li, ul {text-align:left; margin:0; padding:0; } +h1, h2, h3, h4, h3 a {color:#02398B; font-weight:bold; font-size:20px; margin-bottom:15px;} +h1{margin-bottom:10px; font-weight:bold; color:#fff; color:#988157;} +h2, .col_1 h2{background-color:#EFE7CF; color:#9C8452; padding:5px 10px; margin-bottom:0px; font-size:12px;} +h3 {margin-bottom:5px; font-weight:bold; color:#fff; color:#555; font-size:16px;} +h4 {border-bottom: 1px solid #ccc; padding-bottom:5px; margin-bottom:5px; font-size:12px;} +h5 {border-bottom: 1px solid #ccc; padding-bottom:5px; margin-bottom:5px; font-size:12px;} +p, #col_1 li, #col_2 li{ line-height:160%;}/*Original:{font-size:100%; line-height:160%;}*/ +p{ margin-bottom:10px;} +a {color:#004587; /*023467 (blue)*/} +a:hover {text-decoration:none;} + +/* form */ +input, button, textarea, select, optgroup, option {font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit;} +input[type="text"] {width: 200px; border: 1px solid #CCC;} +input[type="password"] {width: 200px;border: 1px solid #CCC;} +input, button, textarea, select {*font-size: 100%;} /* purpose To enable resizing for IE @branch For IE6-Win, IE7-Win */ +textarea{ width:100%; height:100px;} + +.two_col_form label{ float: left; width: 100px;} +.two_col_form input{} + +/*table*/ +table {margin:0px;} +table td, table th{text-align:left; border-collapse: collapse; border-spacing: 0;} +p, table {line-height: 160%;} + +/*other*/ +img {border: none;} +hr {height:1px; color:#ccc; background: #F2F1E8; border:none;} +.hr {border-bottom:1px solid #F2F1E8; padding-bottom:10px; margin-bottom:10px;} +.hr2 {border-bottom:1px solid #F2F1E8; padding-bottom:5px; margin-bottom:5px;} +.data_table td button, td .button{float:right;} +.margin_right_5{ margin-right:5px;} +.margin_right{ margin-right:10px;} +.padding_right{ padding-right: 10px;} +.padding_left{ padding-left: 10px;} +.padding_20{padding: 20px;} + +/* NAVS +-----------------------------------*/ +/*main nav*/ +.nav_wrp{padding-left:10px; + background-color:#0045ac; + border-bottom:5px solid #0080bd; + background:#023467; + border-bottom:10px solid #666; + background-color:#fff;} +ul#nav, .nav li{margin:0; padding:0; list-style: none;} +ul#nav{padding-top:0px;} +ul#nav li{position:relative; float:left; font-weight:bold;} +ul#nav li.hover a{background-color:#333;} +ul#nav li a{ + display:block; + margin:0; + padding: 5px 10px; + margin-top: 10px; + margin-bottom: 10px; + color:#fff; + background-color:#1e538a; + margin-right:5px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} +ul#nav li a.selected{background-color:#0080bd;} + +/**/ +#login_msg{float:right; clear: both; padding:0px; color:#eee; text-align:right;} +#login_msg span { + display:block; + float: left; + margin:0; + padding: 5px 10px; + margin-top: 10px; + margin-bottom: 10px;} +#login_msg a { + display:block; + float: left; + margin:0; + padding: 5px 10px; + margin-top: 10px; + margin-bottom: 10px; + color:#fff; + background-color:#eee; + color: #333; + margin-right:5px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +/* LAYOUT +-----------------------------------*/ + +/*cols*/ +#main{ margin:10px;} + +.full_col{background-color:#fff; border:1px solid #DBE1E6; box-shadow: 0 0 3px #ddd;} +.left_col{width:210px; position: absolute; font-size:12px; } +.left_col_box {background-color:#fff; border:1px solid #DBE1E6; box-shadow: 0 0 3px #ddd; + -moz-border-radius: 5px; + -webkit-border-radius: 5x; + border-radius: 5px; +} +.left_col_box h2{ + border:none; + -moz-border-radius: 5px; + -webkit-border-radius: 5x; + border-radius: 5px; +} +.right_col { + margin-left: 215px; + overflow:hidden; + text-align:left; + background-color:#fff; +} + +/* FORMS +-----------------------------------*/ + +/*form table*/ +.form_table_min_width{width:600px;} +.form_table label{float:left; padding-right:5px;} /*TODO: test if float is OK*/ +.form_table td.col1{width:120px;} +.form_table td.col2{width:150px;} +.form_table td.col3{width:170px;} +.form_table td.col4{width:120px;} +.form_table td.col5{} +.form_table td.col23{width:320px;} +/*helper widths*/ +.width_{} +.table_toolbar{ } + +.list li{ margin-left: 15px; margin-bottom: 5px;} + +form textarea {height: 300px;} + + +/* UTILITY +-----------------------------------*/ +/* slightly enhanced, universal clearfix hack */ +.clearfix:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +.clearfix { display: inline-block; } +/* start commented backslash hack \*/ +* html .clearfix { height: 1%; } +.clearfix { display: block; } +/* close commented backslash hack */ + +.alpha{filter:alpha(opacity=35); -moz-opacity:0.35; opacity: 0.35;} +.padding{padding:10px 0px;} +.left{float:left;} +.right, a.right{float:right;} +.margin{margin:10px;} +.margin_bottom{margin-bottom: 10px;} +.margin_left{margin-left: 10px;} + +.margin_left5{margin-left: 5px;} +.margin_right5{margin-right: 5px;} +.margin_bottom5{margin-bottom: 5px;} + +.margin_top{margin-top: 10px;} +.margin_top5{margin-top: 5px;} +.hide{display:none;} +.clr{clear:both;} +.strong{ font-weight:bold;} +.align_right{ text-align:right;} +.red{color:Red;} +.full_width, .width_full{ width:100%;} +* html .width_full{float:left;}/*IE6 bug */ +.half_width{ width:50%;} +.highlight{background-color: #ffc;} + +/*loader*/ +#loader{position:absolute; top:0; right:0;} +#loader span{display:block; padding:5px 10px; background-color:#f00; color:#fff; font-style:italic; font-weight:bold;} + +/*icons*/ +.icon_back, .icon_excel, .icon_edit, .icon_add, .icon_user, .icon_blog, .icon_status, .icon_error, .icon_idea, .icon_help{padding:1px 0px 1px 20px; } +.icon_edit{background: url(../images/icons/icon_edit.gif) no-repeat 0px 50%;} +.icon_excel{background: url(../images/icons/icon_excel.png) no-repeat 0px 50%;} +.icon_add{background: url(../images/icons/icon_add.gif) no-repeat 0px 50%;} +.icon_user{background: url(../images/icons/icon_user.png) no-repeat 0px 50%;} +.icon_blog{background: url(../images/icons/icon_blog.png) no-repeat 0px 50%;} +.icon_status{background: url(../images/icons/icon_done.png) no-repeat 0px 50%;} +.approveStatus_0{background: url(../images/icons/icon_star_2.png) no-repeat 4px 50%;} +.icon_error{background: url(../images/icons/error_add.png) no-repeat 0px 50%;} +.icon_idea{background: url(../images/icons/idea.png) no-repeat 0px 50%;} +.icon_help{background: url(../images/icons/help_contents.gif) no-repeat 0px 50%;} +.icon_back{background: url(../images/icons/icon_nav_back.gif) no-repeat 0px 50%;} + + +/* BLOCKS +-----------------------------------*/ + +/*form*/ +input, select, textarea{/*margin-bottom:5px;*/} +input[type="radio"], input[type="checkbox"]{margin-bottom:0px; margin-right:5px; margin-top:0px; margin-left:0px; } +.radio, .checkbox {margin-bottom:0px; margin-right:5px; margin-top:0px; margin-left:0px;} /*again for IE6 because IE6 does not take type sudo class*/ +label{font-size:12px; margin-bottom:1px; display:block;} +.section{padding:20px; border:1px solid #EFE7CF; margin-bottom:10px;} +/*.sectiongrid{padding:0px; border:1px solid #EFE7CF; margin-bottom:10px;}*/ +.table{width:100%; font-size:12px;} +* html .table{width:99%;} + +.form_error{ margin-left: 10px; color: #f00;} + +/*table paging*/ +.top_paging a:hover{ +background: -moz-linear-gradient(0% 170% 90deg, #b8b8b8, white); +background: -webkit-gradient(linear, 0% 0%, 0% 170%, from(white), to(#b8b8b8)); +border-color: #99ccff; +color: #333333; +} +.top_paging {margin-bottom:0px; margin-top:0px;} +.top_paging .previous span, .top_paging .next span{ +display:block; height:18px; cursor:pointer; +} +.top_paging .previous, .top_paging .next{ +display:block; margin-left:5px; float: left; +height:16px; width:16px; border:1px solid #ccc;} +.top_paging .next{ margin-left: 5px; border-left: none; } +.top_paging .previous span{ +font-weight: bold; +background: url(../images/icons/arrow_left.gif) no-repeat 60% 58%; +} +.top_paging .next span{ +font-weight: bold; +background: url(../images/icons/arrow_right.gif) no-repeat 60% 58%; +} +.top_paging select{ padding:0; margin-right: 10px; margin-left: 10px;} +.top_paging .previous, .top_paging .next{ +-moz-border-radius: 3px; +-webkit-border-radius: 3px; +background: white url('button.png') 0 0 repeat-x; /* Image fallback */ +background: -moz-linear-gradient(0% 170% 90deg, #c4c4c4, white); +background: -webkit-gradient(linear, 0% 0%, 0% 170%, from(white), to(#c4c4c4)); +border: 1px solid; +border-color: #e6e6e6 #cccccc #cccccc #e6e6e6; +border-radius: 3px; +color: #404040; +display: inline-block; +font-family: "helvetica neue", helvetica, arial, freesans, "liberation sans", "numbus sans l", sans-serif; +font-size: 13px; +outline 0; +padding: 5px 8px 5px; +text-align: center; +text-decoration: none; +text-shadow: 1px 1px 0 white; +white-space: nowrap; +} + +.top_paging_status_text{line-height:28px; font-size:14px;} +.top_paging_per_page_wrp{ margin-right:20px;} +.top_paging_per_page_wrp select{ font-size:11px;} + +#content input, #content select, #content textarea { + border: 1px solid #CCCCCC; +} + +/*texts*/ +h1{ color:#333; font-weight:bold; font-size:24px;} +h1 span{color:#999;} +h2 {background:transparent url(../images/gsprite_pg_slate_062209.gif) repeat-x scroll 0 0; color:#333; border:1px solid #DBE1E6;} +.section h4 {border-bottom:1px solid #DBE1E6; color:#555555} + +.col_2 h2{ margin-bottom:5px;} +.left_cont{ border:none; border:1px solid #DBE1E6; border-top:none;} +.left_cont_inner{ padding:10px;} +.col_1 h2{background-color:#d7d6d6; color:#333;} +a{ color:#16387c} + +#header{ background-color: #101010;} + +/*nav*/ +ul#nav{ margin: 0px 0 0 0; padding-top: 0;} +ul#nav li a{text-decoration:none; color: #eee} +ul#nav li a:hover, ul.tabs li a:hover, ul.tabs2 li a:hover{text-decoration:underline;} + +ul.left_nav{ margin: 0; padding: 10px 20px 10px 10px;} +ul.left_nav li{ margin: 0; padding: 0; list-style-type: none;} +ul.left_nav li a{ display: block; padding: 5px 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5x; + border-radius: 5px; } +ul.left_nav li a.selected {background-color: #eee; color: #111; text-decoration:none;} + +ol.breadcrumbs{ margin:0px 0 0px 0; padding:0px 0 10px 0;} +ol.breadcrumbs li{ display:inline; margin:0; padding:0; color:#999; font-size:11px;} + +.status_bar{background:transparent url(../images/gsprite_pg_slate_062209.gif) repeat-x scroll 0 0; border:1px solid #DBE1E6;} +ul#nav li a{background-color: Transparent; color:#eee; /*font-size: 22px; for ipad*/ } +ul#nav li a.selected {background-color:#666; color:#fff;} + + +/*popup*/ +.modal_popup_wrp_header{background:transparent url(../images/gsprite_pg_slate_062209.gif) repeat-x scroll 0 0;} +.modal_popup_wrp_header p {color:#333;} +.modal_popup_wrp{border:5px solid #DBE1E6;} + +/*table*/ +table.data_table{border-collapse: collapse; border-spacing: 0; border-top: 1px solid #DBE1E6; border-bottom: 1px solid #DBE1E6; + +} +table.data_table td, table.data_table th{padding:5px 10px; font-size:11px; } +table.data_table th{ background:url("http://s0.wp.com/wp-admin/images/gray-grad.png") repeat-x scroll left top #DFDFDF; color:#333;} +table.data_table th.header{ color:#fff; } +table.data_table td{ background-color:#f5f5f5; border-bottom: 1px solid #d4d8de;} + +table.data_table tr.alt td{ background-color:#fff;} +table.data_table tbody tr:hover td, table.data_table tbody tr.alt:hover td {background-color: #ffc;} +table.data_table tr td.table_toolbar{ background-color:#6688a4;} + +.button { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + background: white url('button.png') 0 0 repeat-x; /* Image fallback */ + background: -moz-linear-gradient(0% 170% 90deg, #c4c4c4, white); + background: -webkit-gradient(linear, 0% 0%, 0% 170%, from(white), to(#c4c4c4)); + border: 1px solid; + border-color: #e6e6e6 #cccccc #cccccc #e6e6e6; + border-radius: 3px; + color: #404040; + display: inline-block; + font-family: "helvetica neue", helvetica, arial, freesans, "liberation sans", "numbus sans l", sans-serif; + font-size: 13px; + outline 0; + padding: 5px 8px 5px; + text-align: center; + text-decoration: none; + text-shadow: 1px 1px 0 white; + white-space: nowrap; } + + .button:hover { + background: -moz-linear-gradient(0% 170% 90deg, #b8b8b8, white); + background: -webkit-gradient(linear, 0% 0%, 0% 170%, from(white), to(#b8b8b8)); + border-color: #99ccff; + color: #333333; } + + .button:active { + position: relative; + top: 1px; } + + .button:active, .button:focus { + background-position: 0 -25px; + background: -moz-linear-gradient(0% 170% 90deg, white, #dedede); + background: -webkit-gradient(linear, 0% 0%, 0% 170%, from(#dedede), to(white)); + border-color: #8fc7ff #94c9ff #94c9ff #8fc7ff; + color: #1a1a1a; + text-shadow: 1px -1px 0 rgba(255, 255, 255, 0.5); } + +.section button, .status_bar button{margin-right:0px; margin-left:0px; } +.data_table .button{font-size:11px; } + +/*popup search form*/ +#accountSearch .section{background:#E8EDF0 url(../images/page_bg_slate_070609.gif) repeat-x scroll 0 0;} + +.paging .previous, .paging .next{background:transparent url(../images/gsprite_pg_slate_062209.gif) repeat-x scroll 0 0%; border:1px solid #DBE1E6;} + +table.data_table tr.lead_status_row_1 td{ background-color:#FFFFCC;} + +/*message*/ +#message_wrp{text-align: center;} +#message_wrp #message_box{ + width:200px; + background-color: #FFFFE0; + border-left: 1px solid #E6DB55; + border-right: 1px solid #E6DB55; + border-bottom: 1px solid #E6DB55; + position: absolute; + z-index: 888888; + left: 50%; + margin-left: -100px; + padding: 5px; + font-weight: bold; + -moz-border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5x; + border-bottom-left-radius: 5px; + -moz-border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5x; + border-bottom-right-radius: 5px; } + +table.data_table tr.lead_status_row_1 td{background-color:#7FFFD4;} + +/*lead comments*/ +.comment p{padding:10px; background-color:#eee; border-bottom: 1px solid #ccc; margin-left:40px;} +.comment_box p{padding: 0px; margin-left:40px;} +.comment_box textarea{border: 1px solid #ccc; margin-bottom:10px;} + +.action_bar {padding: 5px; background-color:#eee; margin-bottom:5px; -moz-border-radius: 5px; + -webkit-border-radius: 5x; + border-radius: 5px; } +.action_bar label, .action_bar a{ line-height: 17px;} \ No newline at end of file diff --git a/app/admin/content/images/.DS_Store b/app/admin/content/images/.DS_Store new file mode 100644 index 0000000..46f7ed5 Binary files /dev/null and b/app/admin/content/images/.DS_Store differ diff --git a/app/admin/content/images/icons/.DS_Store b/app/admin/content/images/icons/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/app/admin/content/images/icons/.DS_Store differ diff --git a/app/admin/content/images/icons/arrow_left.gif b/app/admin/content/images/icons/arrow_left.gif new file mode 100644 index 0000000..932ade1 Binary files /dev/null and b/app/admin/content/images/icons/arrow_left.gif differ diff --git a/app/admin/content/images/icons/arrow_right.gif b/app/admin/content/images/icons/arrow_right.gif new file mode 100644 index 0000000..efb1263 Binary files /dev/null and b/app/admin/content/images/icons/arrow_right.gif differ diff --git a/app/admin/controllers/Admin.js b/app/admin/controllers/Admin.js new file mode 100644 index 0000000..cf65907 --- /dev/null +++ b/app/admin/controllers/Admin.js @@ -0,0 +1,47 @@ +(function ($, tmpl, html, service) { + + var helpers = {}; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + var content = tmpl(view, {}, helpers); + + var btn = $('#croll', content), + btn2 = $('#list', content); + + btn.click(function(){ + + service.send({ + url: 'spider/hyps', + success: function(d){ + console.log(d); + }, + error: function(){ + + } + }); + + return false; + }); + + btn2.click(function(){ + + service.get({ + url: 'hypoteka/list', + success: function(d){ + //console.log(d); + }, + error: function(){ + + } + }); + + return false; + }); + + callBack(content); + } + }; +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Blog.js b/app/admin/controllers/Blog.js new file mode 100644 index 0000000..dcbcc6b --- /dev/null +++ b/app/admin/controllers/Blog.js @@ -0,0 +1,130 @@ +(function ($, tmpl, html, service) { + + var helpers = { + date: MVC.util.string.formatDate + }; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + var pageSize = parseInt(params.p2), + index = parseInt(params.p1); + + // + service.get({ + url: 'blog/list/' + index + '/' + pageSize, + success: function (d) { + + // Paging. + helpers.paging = function () { + return html.paging({ + currentPage: index, + itemsPerPage: pageSize, + numberofItems: d.data.blogCount, + pageNumberPrefix: "#Blog/Index/", + pageNumberSuffix: "/" + pageSize + '/', + showPerPage: false + }); + }; + + var content = tmpl(view, { + blogs: d.data.blogs + }, helpers); + callBack(content); + } + }); + }, + Edit: function (params, view, callBack, onError) { + + service.get({ + url: 'blog/view/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + blog: d.data + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content), + deleteBtn = $('#delete', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'blog/update', + success: function (d) { + + // Show message. + MVC.message.show({text: 'Saved!', hideDealy: 2000}); + } + }); + + return false; + }); + + // Bind save click. + deleteBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: { + url: params.p1 + }, + url: 'blog/delete', + success: function (d) { + + window.location.hash = 'Blog'; + + // Show message. + MVC.message.show({text: 'Deleted!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + }, + Create: function (params, view, callBack, onError) { + + var content = tmpl(view, {}, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'blog/create', + success: function (d) { + + window.location.hash = 'Blog'; + + // Show message. + MVC.message.show({text: d.message, hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }; + +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Comment.js b/app/admin/controllers/Comment.js new file mode 100644 index 0000000..a5bda71 --- /dev/null +++ b/app/admin/controllers/Comment.js @@ -0,0 +1,100 @@ +(function ($, tmpl, html, service) { + + var helpers = { + date: MVC.util.string.formatDate + }; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + var pageSize = parseInt(params.p2), + index = parseInt(params.p1), + campaignGuid = params.p3; + + service.get({ + url: 'blog/listcomments/1/10', + success: function (d) { + + // Paging. + helpers.paging = function () { + return html.paging({ + currentPage: index, + itemsPerPage: pageSize, + numberofItems: d.data.commentCount, + pageNumberPrefix: "#Comment/Index/", + pageNumberSuffix: "/" + pageSize + '/', + showPerPage: false + }); + }; + + var content = tmpl(view, { + comments: d.data.comment + }, helpers); + callBack(content); + } + }); + }, + Edit: function (params, view, callBack, onError) { + + service.get({ + url: 'Comment/view/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + blog: d.data + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content), + deleteBtn = $('#delete', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'blog/update', + success: function (d) { + + // Show message. + MVC.message.show({text: 'Saved!', hideDealy: 2000}); + } + }); + + return false; + }); + + // Bind save click. + deleteBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: { + url: params.p1 + }, + url: 'blog/delete', + success: function (d) { + + window.location.hash = 'Blog'; + + // Show message. + MVC.message.show({text: 'Deleted!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + } + }; + +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Dash.js b/app/admin/controllers/Dash.js new file mode 100644 index 0000000..be442bb --- /dev/null +++ b/app/admin/controllers/Dash.js @@ -0,0 +1,14 @@ +(function ($, tmpl, html, service) { + + var helpers = {}; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + var content = tmpl(view, {}, helpers); + + callBack(content); + } + }; +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/File.js b/app/admin/controllers/File.js new file mode 100644 index 0000000..ee2859d --- /dev/null +++ b/app/admin/controllers/File.js @@ -0,0 +1,122 @@ +(function ($, tmpl, html, service) { + + var helpers = {}; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + service.get({ + url: 'file/list', + success: function (d) { + + var content = tmpl(view, {files: d.data}, helpers); + + // Delete file binding. + $('.deleteFileBtn', content).click(function(){ + + var that = $(this), + href = that.attr('href'); + + service.send({ + url: 'file/delete', + data: { + name: href + }, + success: function (d) { + + that.closest('tr').hide(); + + } + }); + + console.log(href) + + return false; + }); + + callBack(content); + } + }); + }, + Upload: function (params, view, callBack, onError) { + + var content = tmpl(view, {}, helpers); + + var messageWrp = $('#fileDataMsg', content); + + // Source: + // http://www.matlus.com/html5-file-upload-with-progress/ + + $('#fileToUpload', content).change(function(){ + + var file = document.getElementById('fileToUpload').files[0]; + + if (file) { + + var fileSize = 0; + + if (file.size > 1024 * 1024){ + fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB'; + } else { + fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB'; + } + + // File info message. + messageWrp.html('Name: ' + file.name + ' Size: ' + fileSize + ' Type: ' + file.type); + } + }); + + $('#uploadFileBtn', content).click(function () { + + // Form data. + var fd = new FormData(); + fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]); + + var xhr = new XMLHttpRequest(); + + // Progress listerner. + xhr.upload.addEventListener("progress", function (evt) { + if (evt.lengthComputable) { + var percentComplete = Math.round(evt.loaded * 100 / evt.total); + messageWrp.html(percentComplete.toString() + '%'); + } + else { + messageWrp.html('unable to compute'); + } + }, false); + + // On finished. + xhr.addEventListener("load", function (evt) { + + // Parse json. + var obj = $.parseJSON(evt.target.responseText); + + window.location.hash = 'File'; + + // Show success message. + MVC.message.show({text: obj.message, hideDealy: 2000}); + }, false); + + // On failed. + xhr.addEventListener("error", function (evt) { + MVC.message.show({text: 'There was an error attempting to upload the file.', + hideDealy: 2000}); + }, false); + + // On cancel. + xhr.addEventListener("abort", function (evt) { + MVC.message.show({text: 'The upload has been canceled by the user or the browser dropped the connection.', + hideDealy: 2000}); + }, false); + + xhr.open("POST", "/upload"); + xhr.send(fd); + return false; + }); + + callBack(content); + } + }; +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Page.js b/app/admin/controllers/Page.js new file mode 100644 index 0000000..3dbd825 --- /dev/null +++ b/app/admin/controllers/Page.js @@ -0,0 +1,131 @@ +(function ($, tmpl, html, service) { + + var helpers = { + date: MVC.util.string.formatDate + }; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + var pageSize = parseInt(params.p2), + index = parseInt(params.p1), + campaignGuid = params.p3; + + // + service.get({ + url: 'page/list/' + index + '/' + pageSize, + success: function (d) { + + // Paging. + helpers.paging = function () { + return html.paging({ + currentPage: index, + itemsPerPage: pageSize, + numberofItems: d.data.pageCount, + pageNumberPrefix: "#Page/Index/", + pageNumberSuffix: "/" + pageSize + '/', + showPerPage: false + }); + }; + + var content = tmpl(view, { + pages: d.data.pages + }, helpers); + callBack(content); + } + }); + }, + Edit: function (params, view, callBack, onError) { + + service.get({ + url: 'page/view/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + page: d.data + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content), + deleteBtn = $('#delete', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'page/update', + success: function (d) { + + // Show message. + MVC.message.show({text: 'Page was saged.', hideDealy: 2000}); + } + }); + + return false; + }); + + // Bind save click. + deleteBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: { + url: params.p1 + }, + url: 'page/delete', + success: function (d) { + + window.location.hash = 'Page'; + + // Show message. + MVC.message.show({text: 'Page was deleted!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + }, + Create: function (params, view, callBack, onError) { + + var content = tmpl(view, {}, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'page/create', + success: function (d) { + + window.location.hash = 'Page'; + + // Show message. + MVC.message.show({text: 'Page was created!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }; + +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Template.js b/app/admin/controllers/Template.js new file mode 100644 index 0000000..644d20d --- /dev/null +++ b/app/admin/controllers/Template.js @@ -0,0 +1,49 @@ +(function ($, tmpl, html, service) { + + var helpers = {}; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + // Get template + service.get({ + url: 'template/get/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + template: d.data + }); + + var form = $('form', content), + saveBtn = $('#save', content); + + saveBtn.click(function(){ + + var fromData = form.serialize(); + + // Add page param. + fromData = fromData + '&page=' + params.p1; + + // Save to server. + service.send({ + data: fromData, + url: 'template/update', + success: function (d) { + + // Show message. + MVC.message.show({text: 'Saved!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + } + }; + +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/User.js b/app/admin/controllers/User.js new file mode 100644 index 0000000..4d7139c --- /dev/null +++ b/app/admin/controllers/User.js @@ -0,0 +1,176 @@ +(function ($, tmpl, util, html, service) { + + var helpers = { + truncate: util.truncate, + formatDate: util.string.formatDate, + helpers: html.select + }; + + // Get user decision. + var userSession = MVC.session.get('user'); + + // Creating menu entitelment. + if (userSession.userType === 'root') { + helpers.getOrgControl = function (name, list, selected) { + + var selectList = []; + + // Need to remap. + $.each(list, function(i, d){ + selectList.push({ + value: d.guid, + text: d.name + }); + }); + + return html.select(name, selectList, selected); + } + } else { + helpers.getOrgControl = function (name, list, selected) { + return '' + userSession.organizationName + ''; + }; + } + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + var url = 'user/list'; + + service.get({ + url: url, + success: function (d) { + + var pageSize = parseInt(params.p2), + index = parseInt(params.p1); + + // Paging. + helpers.paging = function () { + return html.paging({ + currentPage: index, + itemsPerPage: pageSize, + numberofItems: 100, + pageNumberPrefix: "#/User/Index/", + pageNumberSuffix: "/" + 10 + '/', + showPerPage: true + }); + }; + + var content = tmpl(view, { + users: d.data.users + }, helpers); + callBack(content); + } + }); + }, + View: function (params, view, callBack, onError) { + + service.get({ + url: 'user/view/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + user: d.data.user + }, helpers); + + var deleteBtn = $('#deleteBtn', content); + + // Bind save click. + deleteBtn.click(function(){ + + // Add guid. + service.send({ + data: {guid: params.p1}, + url: 'user/delete', + success: function (d) { + + window.location.hash = 'User'; + + // Show message. + MVC.message.show({text: 'User was updated!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + }, + Edit: function (params, view, callBack, onError) { + + var userGuid = params.p1; + + service.get({ + url: 'user/view/' + userGuid, + success: function (d) { + + var content = tmpl(view, { + user: d.data.user, + session: userSession + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#saveBtn', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + // Add guid. + service.send({ + data: fromData, + url: 'user/update', + success: function (d) { + + //window.location.hash = 'User'; + + // Show message. + MVC.message.show({text: 'User was updated!', hideDealy: 2000}); + } + }); + return false; + }); + callBack(content); + } + }); + }, + Create: function (params, view, callBack, onError) { + + var content = tmpl(view, { + session: userSession + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#saveBtn', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'user/create', + success: function (d) { + + window.location.hash = 'User'; + + // Show message. + MVC.message.show({text: 'User was created!', hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }; + +})(jQuery, jQuery.tmpl, MVC.util, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/controllers/Zone.js b/app/admin/controllers/Zone.js new file mode 100644 index 0000000..06bae2d --- /dev/null +++ b/app/admin/controllers/Zone.js @@ -0,0 +1,127 @@ +(function ($, tmpl, html, service) { + + var helpers = { + date: MVC.util.string.formatDate + }; + + return { + + // Index action. + Index: function (params, view, callBack, onError) { + + // + service.get({ + url: 'zone/list', + success: function (d) { + + // Paging. + helpers.paging = function () { + return html.paging({ + currentPage: 1, + itemsPerPage: 10, + numberofItems: 100, + pageNumberPrefix: "#/Zone/Index/", + pageNumberSuffix: "/" + 10 + '/', + showPerPage: false + }); + }; + + var content = tmpl(view, { + zones: d.data + }, helpers); + callBack(content); + } + }); + }, + Edit: function (params, view, callBack, onError) { + + service.get({ + url: 'zone/view/' + params.p1, + success: function (d) { + + var content = tmpl(view, { + zone: d.data + }, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content), + deleteBtn = $('#delete', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'zone/update', + success: function (d) { + + // Show message. + MVC.message.show({text: d.message, hideDealy: 2000}); + } + }); + + return false; + }); + + // Bind save click. + deleteBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: { + key: params.p1 + }, + url: 'zone/delete', + success: function (d) { + + window.location.hash = 'Zone'; + + // Show message. + MVC.message.show({text: d.message, hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }); + }, + Create: function (params, view, callBack, onError) { + + var content = tmpl(view, {}, helpers); + + // Bind From. + var form = $('form', content), + saveBtn = $('#save', content); + + // Bind save click. + saveBtn.click(function(){ + + var fromData = form.serialize(); + + service.send({ + data: fromData, + url: 'zone/create', + success: function (d) { + + window.location.hash = 'Zone'; + + // Show message. + MVC.message.show({text: d.message, hideDealy: 2000}); + } + }); + + return false; + }); + + callBack(content); + } + }; + +})(jQuery, jQuery.tmpl, MVC.html, MVC.service) \ No newline at end of file diff --git a/app/admin/index.html b/app/admin/index.html new file mode 100644 index 0000000..46a6513 --- /dev/null +++ b/app/admin/index.html @@ -0,0 +1,55 @@ + + + + + Portal + + + + +
    + + +
    +
    +
    +
      +
    +
    + +
    +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + diff --git a/app/admin/install.html b/app/admin/install.html new file mode 100644 index 0000000..1602742 --- /dev/null +++ b/app/admin/install.html @@ -0,0 +1,175 @@ + + + + + + Node.js MVC CMS + + + + +
    + +
    +
    +
    +

    1. Create User

    +

    + + +

    +

    + + +

    + +
    + +
    +
    +
    +
    + +
    +
    +
    +

    2. Create Index Page

    +
    + +
    +
    +
    +
    +
    +
    +
    +

    3. Login To Admin

    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + diff --git a/app/admin/library/.DS_Store b/app/admin/library/.DS_Store new file mode 100644 index 0000000..ac035b8 Binary files /dev/null and b/app/admin/library/.DS_Store differ diff --git a/app/admin/library/MVC.config.js b/app/admin/library/MVC.config.js new file mode 100644 index 0000000..ca0549f --- /dev/null +++ b/app/admin/library/MVC.config.js @@ -0,0 +1,14 @@ +(function() { + + //creates namespace + MVC.util.createNs("MVC.config"); + + MVC.config = { + service: { + getUrl: '/json/', + postUrl: '/json/', + extension: '', //.JSON + dataType: 'json' + } + }; +}()); \ No newline at end of file diff --git a/app/admin/library/MVC.html.js b/app/admin/library/MVC.html.js new file mode 100644 index 0000000..db14616 --- /dev/null +++ b/app/admin/library/MVC.html.js @@ -0,0 +1,199 @@ +/// + +/** +* @fileoverview html helpers. +* +* @author dpirek@gmail.com (David Pirek) +*/ + +(function ($, String, Util) { + + //creates namespace + Util.createNs("MVC.html"); + + MVC.html = { + + /* HTML helper (MVC style) + ------------------------------ + + //notes + works similar like HTML helpers in the MVC design pattern + + //example + var b = FNG.Html.Button({text : "click here", id : "my_id", class : "myclass"}); + console.log(b); + */ + + + select: function (name, d, selected) { + + var sb = String.stringBuilder(); //string builder is fast! + + sb.append(''); + + return sb.toString(); + }, + link: function (d) { //create: create window + var m = "{text}", + v = String.template(d, m); + return v; + }, + element: function (d, e) { //create: create window + + /* + note: creates any alement + + d : object with element properties + e : element name (tag name + */ + + var sb = String.stringBuilder(); //string builder is fast! + + sb.append("<" + e + " "); + + $.each(d, function (i, val) { + //leavs out 'text' which is for the text value :) + if (i != "text") { + sb.append(i + "=\"{" + i + "}\" "); + } + }); + + sb.append(">{text}"); + + return String.template(d, sb.toString()); + }, + messageBox: function () { + + /* + note: example of a more complex HTML helper + */ + + var sb = String.stringBuilder(); //string builder is fast! + + sb.append("
    "); + sb.append("{message}"); + sb.append("
    "); + // + return String.template(d, sb.toString()); + }, + divPopup: function (o) { + + //static model + var model = ""; + + //object merge + $.extend({ title: "Title", content: "

    content

    " }, o); + + //merges object to string + return String.template(o, model); + }, + paging: function (options) { + + var settings = { + currentPage: 1, + itemsPerPage: 10, + numberofItems: 100, + pageNumberPrefix: "", + pageNumberSuffix: "", + separator: "of", + perPageText: "Show rows:", + showPerPage: false + }; + + $.extend(settings, options); + + var o = settings; + + //gets number of pages + var numberOfPages = (o.numberofItems / o.itemsPerPage).toFixed(); + + //add one if .toFixed() rounds down + if (o.numberofItems > (numberOfPages * o.itemsPerPage)) { + numberOfPages++; + } + + var sb = String.stringBuilder(); + + //showes paging if needed + if (numberOfPages >= 1) { + + sb.append(" "); + + sb.append(" "); + + if (!(o.currentPage == 1)) { + sb.append(" "); + } + else { + sb.append(" "); + } + + if (!(o.currentPage == numberOfPages)) { + + sb.append(" "); + } + else { + sb.append(""); + } + + sb.append(""); + + //status text + sb.append(""); + sb.append("" + o.currentPage + " "); + sb.append(o.separator); + sb.append(" " + numberOfPages + " "); + sb.append(""); + + var currentOption = function (a, current) { + + var sb = String.stringBuilder(); + + $.each(a, function (i, d) { + + if (d == current) { + sb.append(""); + } + else { + sb.append(""); + } + + }); + + return sb.toString(); + + } + + if (o.showPerPage) { + + //show rows + sb.append(""); + sb.append("" + o.perPageText + " "); + sb.append(""); + sb.append(""); + } + + sb.append(""); //end tag + + } + + return sb.toString(); + + } + }; + + +})(jQuery, MVC.util.string, MVC.util); \ No newline at end of file diff --git a/app/admin/library/MVC.message.js b/app/admin/library/MVC.message.js new file mode 100644 index 0000000..cc325b4 --- /dev/null +++ b/app/admin/library/MVC.message.js @@ -0,0 +1,41 @@ +/// + +/** +* @fileoverview html helpers. +* +* @author dpirek@gmail.com (David Pirek) +*/ + +(function ($, String, Util) { + + // + var messageBox = $('#message_box'); + + //creates namespace + Util.createNs("MVC.message"); + + MVC.message = { + show: function(settings){ + + messageBox.text(settings.text).show(); + + // Hide message if delay is specified. + if(settings.hideDealy){ + var t = setTimeout(function(){ + MVC.message.hide(); + }, settings.hideDealy); + } + }, + hide: function(settings){ + messageBox.fadeOut(500, function(){ + messageBox.text(''); + }); + }, + showLoader: function(){ + messageBox.text('loading...').show(); + }, + hideLoader: function(){ + messageBox.text('').hide(); + } + }; +})(jQuery, MVC.util.string, MVC.util); \ No newline at end of file diff --git a/app/admin/library/MVC.service.js b/app/admin/library/MVC.service.js new file mode 100644 index 0000000..0a78188 --- /dev/null +++ b/app/admin/library/MVC.service.js @@ -0,0 +1,70 @@ +/// + +/** +* @fileoverview core utility class. +* +* @author dpirek@gmail.com (David Pirek) +*/ + +(function($) { + + //creates namespace + if (typeof MVC == "undefined" || !MVC) { + window.MVC = {}; + }; + + MVC.service = { + _log: function(d){ + // Service logging... + + }, + get: function (settings) { + + var defauls = { + + }; + + $.ajax({ + dataType: MVC.config.service.dataType, + type: 'get', + data: settings.data, + url: MVC.config.service.getUrl + settings.url + MVC.config.service.extension, + success: function (d) { + settings.success(d); + }, + error: function(d){ + + // Error call back. + settings.error(d); + + // Service error log. + MVC.service._log(d); + } + }); + }, + send: function(settings) { + + // + var defauls = {}; + + $.ajax({ + dataType: MVC.config.service.dataType, + type: 'post', + data: settings.data, + url: MVC.config.service.postUrl + settings.url + MVC.config.service.extension, + success: function (d) { + settings.success(d); + }, + error: function(d){ + + // Error call back. + settings.error(d); + + // Service error log. + MVC.service._log(d); + } + }); + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/app/admin/library/MVC.session.js b/app/admin/library/MVC.session.js new file mode 100644 index 0000000..ae70f3c --- /dev/null +++ b/app/admin/library/MVC.session.js @@ -0,0 +1,35 @@ +/// + +/** +* @fileoverview core session class. +* +* @author dpirek@gmail.com (David Pirek) +*/ + +(function($) { + + //creates namespace + if (typeof MVC == "undefined" || !MVC) { + window.MVC = {}; + }; + + var session = {}; + + MVC.session = { + get: function (key) { + + if(session[key]){ + return session[key]; + } else { + return { + message: 'no data' + }; + } + }, + set: function(key, data) { + session[key] = data; + return true; + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/app/admin/library/MVC.util.js b/app/admin/library/MVC.util.js new file mode 100644 index 0000000..44420f4 --- /dev/null +++ b/app/admin/library/MVC.util.js @@ -0,0 +1,39 @@ +/// + +/** +* @fileoverview core utility class. +* +* @author dpirek@gmail.com (David Pirek) +*/ + +(function($) { + + //creates namespace + if (typeof MVC == "undefined" || !MVC) { + window.MVC = {}; + }; + + MVC.util = { + truncate: function (string, length) { + if (typeof string === "undefined" || string == null || string === '') { + return ""; + } + if (string.length < length) { + return string; + } + return '' + string.substring(0, length) + ' …'; + }, + createNs: function() { + var o, d; + $.each(arguments, function(v) { + d = arguments[1].split("."); + o = window[d[0]] = window[d[0]] || {}; + $.each(d.slice(1), function(v2) { + o = o[arguments[1]] = o[arguments[1]] || {}; + }); + }); + return o; + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/app/admin/library/MVC.util.string.js b/app/admin/library/MVC.util.string.js new file mode 100644 index 0000000..1cab405 --- /dev/null +++ b/app/admin/library/MVC.util.string.js @@ -0,0 +1,149 @@ +/// + +/** +* @fileoverview string utils. +* +* @author dpirek@gmail.com (David Pirek) +*/ +(function () { + + // Create namespace. + MVC.util.createNs("MVC.util.string"); + + // + MVC.util.string = { + isEmpty: function (str) { + + if (str.replace(/\s/g, "") == "") { + return true; + } + else { + return false; + } + }, + stringBuilder: function () { + + /* StringBuilder + ------------------------------ + + //notes + works like a regular stringbuilder + + //example + var sb = FNG.Util.String.StringBuilder(); + sb.append("hi "); + sb.append("dave"); + sb.append(" !"); + console.log(sb.toString()); + */ + + var s = []; + return { + // appends + append: function (v) { + if (v) { + s.push(v); + } + }, + // clears + clear: function () { + s.length = 1; + }, + // converts to string + toString: function () { + return s.join(""); + } + } + }, + template: function (m, v) { + v = v.replace(/\{[^\}]*\}/g, function (key) { + return m[key.slice(1, -1)] || ''; + }); + return v; + }, + splitHashLink: function (u) { + var a = u.split("#"); + + if (a[1]) { + var b = a[1].split("/"); + + //returs array or string + if (b[1]) { + return b; + } else { + return b[0]; + } + } + else { + return ""; + } + }, + trimHashLink: function (u) { + var a = u.split("#"); + return a[1]; + }, + getHashValue: function () { + return this.trimHashLink(window.location.hash); + }, + getHost: function (url) { + var host = url.split('/'); + return host[2]; + }, + linkParams: function (u) { + var p = window.location.pathname; + return p.split("/"); + + }, + getRoot: function () { + var W = window.location; + return W.protocol + "//" + W.host + "/"; + }, + isEmail: function (e) { + var r = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; + if (r.test(e) == false) { + return false; + } + return true; + }, + createUrl: function(str) { + + // First cleanup. + str = str.replace(/^\s+|\s+$/g, ""); + + var sF = "ěščřžýáíéĚŠČŘŽÝÁÍÉŮůÚúň", + sT = "escrzyaieescrzyaieuuuun", + from = sF.split(""), + to = sT.split(""); + + for (var i = 0, l = from.length; i < l; i++) { + str = str.replace(new RegExp(from[i], "g"), to[i]); + } + + str = str.replace(/[^a-zA-Z0-9 -]/g, "").replace(/\s+/g, "-").toLowerCase(); + + return str; + }, + formatDate: function (jsonDate) { + + // Node.js json date parse. + var date = new Date(jsonDate); + + // Add hours for czech timeDate. + //date.setHours(6 + date.getHours()); + + return date.getDate() + "." + date.getMonth() + "." + date.getFullYear() + ' ' + date.getHours() + ':' + date.getMinutes() + '.' + date.getSeconds(); + }, + getAge: function (jsonDate) { + // NOT WOKRING. + var date = new Date(jsonDate), + now = new Date(); + + now.setHours(4 + now.getHours()); + + var age = new Date(now - date) + + return now.getHours(); + } + }; + +} ()); \ No newline at end of file diff --git a/app/admin/library/jquery/jquery.MVC.js b/app/admin/library/jquery/jquery.MVC.js new file mode 100644 index 0000000..b83375c --- /dev/null +++ b/app/admin/library/jquery/jquery.MVC.js @@ -0,0 +1,375 @@ +/*! +* jQuery JavaScript MVC routing plugin +* http://www.davidpirek.com/javascript-mvc-jquery-plugin-framework +* +* Copyright 2010, David Pirek +* Licensed: not sure yet send me an email: dpirek@gmail.com +* +*/ + +(function ($) { + + // Get hash function. + var getHashValue = function () { + + var hasValue = window.location.hash.substring(1); + + // Sets default. + if (typeof hasValue == "undefined") { + return false; + } + var hashLen = hasValue.indexOf("?"); + if (hashLen > 0) { + hasValue = hasValue.substring(0, hashLen); + } + return hasValue; + }; + + var onHashChange = function (event, stopTime) { + + // Last hash. + var lastHash = getHashValue(); + + var i = setInterval(function () { + var hash = getHashValue(); + if (hash !== lastHash) { + event(hash); + lastHash = hash; + } + }, 100); + + // Allows for "expiring" has listerner (needed for testing purposes). + if (stopTime > 0) { + setTimeout(function () { + clearInterval(i); + }, stopTime); + } + }; + + // Gets random parameter. + var getRandomParam = function () { + return "?_r=" + Math.random() * 5; + }; + + var removeFristDash = function (path) { + + // Remove '/' as first char. + if (path.charAt(0) === '/') { + path = path.substr(1); + } + + return path; + + }; + + var parsePlaceHolders = function (path) { + + //path = removeFristDash(path); + + // // Remove '/' as first char. + // if (path.charAt(0) === '/') { + // path = path.substr(1); + // } + + var ar = path.split('/'), + re = []; + + // Array to Object. + $.each(ar, function (i, d) { + + var x = d.match(/[{}]/g); + + if (x == null) { + re[i] = false; + } else { + re[i] = true; + } + }); + return re; + }; + + // Create. + var createRoutingTable = function (routes) { + + // routing. + var routingTable = {}; + + var mapRoute = function (name, path, params) { + + // Gets position of different placeholders. + var getPositions = function (path) { + + var arr = [], + o = {}; + + // String to array. + path.replace(/\{[^\}]*\}/g, function (key, index) { + arr.push({ key: key, index: index }); + }); + + // Array to Object. + $.each(arr, function (i, d) { + + // Each character within [ ... ]. + o[d.key.replace(/[{}]/g, '')] = d.index; + }); + return o; + }; + + // Add slash if {controller} is first in the string, + // so that array would have the "prefix" placeholder. + if (path.substr(0, 12) === "{controller}") { + path = "/" + path; + } + + // Parse path into array. + var items = path.split('/'); + + // Create routing table object. + routingTable[name] = { + controller: "", + path: path, + pre: path.substr(0, getPositions(path).controller), + items: items, + placeHolders: parsePlaceHolders(path), + params: params + }; + }; + + $.each(routes, function (i, d) { + mapRoute(d.name, d.path, d.params); + }); + + return routingTable; + }; + + var rounte = function (table, hash) { + + var matchCount = 0; + var params, + actionObject = {}; + + // Loop table. + $.each(table, function (i, d) { + + var items = hash.split('/'); + + // Add start '/' if not presnet + if (hash.charAt(0) !== '/' && d.pre != items[0] + "/") { + hash = '/' + hash; + // Split again. + items = hash.split('/'); + } + + var tableItems = d.items, + o = {}; + + params = d.params; + + if (matchCount < 1) { + + // Loop folders. + $.each(d.placeHolders, function (i, d) { + + if (items[i] === tableItems[i]) { + matchCount++; + } + + if (d) { + //build action object + actionObject[tableItems[i].replace(/[{}]/g, '')] = items[i]; + } + + }); + } + + // If there is a match don't search any more. + if (matchCount < 2) { + + // Merge with defaults, if there are some params missing. + $.each(actionObject, function (i, d) { + if (typeof d == "undefined" || d == "") { + actionObject[i] = params[i]; + } + }); + return; + } + }); + + return actionObject; + }; + + var multiAjax = function (requests, success, error) { + + var sucessIndex = 1, + numberOfRequests = requests.length - 1, + data = {}; + + $.each(requests, function (i, d) { + + $.ajax({ + type: d.type, + url: d.url, + dataType: d.dataType, + error: function () { + if (typeof error == 'function') { + error('could not load: ' + d.url); + } + }, + success: function (d2) { + data[d.id] = d2; + if (sucessIndex > numberOfRequests) { + success(data); + } + else { + sucessIndex++; + } + } + }); + + }); + }; + + // MVC plugin function. + $.fn.MVC = function (op) { + + // Defaults. + var defaults = { + rootPath: "", + viewsPath: "Views/", + controllersPath: "Controllers/", + start: function (o) { }, + success: function (o) { }, + error: function (o) { }, + stopListenToHash: 0, + errorMessage: "

    error...

    " + }; + + // Build main options before element iteration. + $.extend(defaults, op); + + // Iterate and reformat each matched element. + return this.each(function () { + + // Target content wrapper. + var contentDiv = $(this); + + var routingTable = createRoutingTable(defaults.routes); + + var loadPage = function (hash) { + + // On load method. + defaults.start(); + + var actionObject = rounte(routingTable, hash); + + // Run. + var run = function (controller, action, params) { + + //Check if routs were found, if not return an error message. + if (typeof controller == "undefined" || typeof controller == "action") { + + // Put action HTML to the DOM. + contentDiv.html(defaults.errorMessage); + + // Run external callback + defaults.success({ + actionObject: actionObject, + viewTemplate: viewTemplate, + content: defaults.errorMessage + }); + + } else { + + var exec = function (isSuccessful, viewTemplate, controllerObject) { + + if (isSuccessful) { + + // Check if action is defined inside of the controller. + if (typeof controllerObject[action] == "undefined") { + + // Put action HTML to the DOM. + contentDiv.html(defaults.errorMessage); + + // Run external callback + defaults.success({ + actionObject: actionObject, + viewTemplate: viewTemplate, + content: content + }); + + // Run error callback. + defaults.error(defaults.errorMessage); + + } else { + + // Run action method. + controllerObject[action](actionObject, viewTemplate, function (content) { + + // Put action HTML to the DOM. + contentDiv.html(content); + + // Run external callback + defaults.success({ + actionObject: actionObject, + viewTemplate: viewTemplate, + content: content + }); + }, defaults.error); + } + } else { + + // Put action HTML to the DOM. + contentDiv.html(defaults.errorMessage); + + // Run external callback + defaults.success({ + actionObject: actionObject, + viewTemplate: viewTemplate, + content: content + }); + } + }; + + multiAjax([ + { + id: "view", + type: "Get", + url: defaults.rootPath + defaults.viewsPath + controller + "/" + action + ".html" + getRandomParam(), + dataType: "html" + }, + { + id: "controller", + type: "Get", + url: defaults.rootPath + defaults.controllersPath + controller + ".js" + getRandomParam(), + dataType: "script" + }], + // Sucess. + function (d) { + exec(true, d.view, eval('(' + d.controller + ')')); + }, + // Error. + function (d) { + exec(false); + defaults.error("controller did not load"); + }); + } + }; + + //run + run(actionObject.controller, actionObject.action, actionObject); + }; + + // Init + (function () { + var currentHash = getHashValue(); + + // Init hash listener. + onHashChange(loadPage, defaults.stopListenToHash); + + // Make the first load. + loadPage(currentHash); + })(); + }); + }; +})(jQuery); diff --git a/app/admin/library/jquery/jquery.ajaxForm.js b/app/admin/library/jquery/jquery.ajaxForm.js new file mode 100644 index 0000000..a19dc3d --- /dev/null +++ b/app/admin/library/jquery/jquery.ajaxForm.js @@ -0,0 +1,58 @@ +/* AJAX FORM Plugin +-------------------------------------- + +Init method: +$('#myForm').ajaxForm(); + +*/ + +(function ($) { + + // plugin definition + $.fn.ajaxForm = function (op) { + + // Defaults. + var defaults = { + start: function () { }, + sucess: function () { }, + error: function () { }, + buttonSelector: '.submit' + }; + + $.extend(defaults, op); + + // iterate and reformat each matched element + return this.each(function () { + + // + var context = $(this), + submitButton = $(defaults.buttonSelector, context), + url = context.attr('action'), + method = context.attr('method'); + + //button click + submitButton.click(function () { + + // On start. + defaults.start(submitButton); + + // Ajax + $.ajax({ + type: method, + url: url, + data: context.serializeArray(), + dataType: "json", + success: defaults.sucess, + error: defaults.error + }); + + return false; + }); + + }); + }; + +})(jQuery); + + + diff --git a/app/admin/library/jquery/jquery.min.js b/app/admin/library/jquery/jquery.min.js new file mode 100644 index 0000000..c238e43 --- /dev/null +++ b/app/admin/library/jquery/jquery.min.js @@ -0,0 +1,590 @@ +/*! +* jQuery JavaScript Library v1.4.2 +* http://jquery.com/ +* +* Copyright 2010, John Resig +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* Includes Sizzle.js +* http://sizzlejs.com/ +* Copyright 2010, The Dojo Foundation +* Released under the MIT, BSD, and GPL Licenses. +* +* Date: Sat Feb 13 22:33:48 2010 -0500 +*/ +(function(A, w) { + function ma() { if (!c.isReady) { try { s.documentElement.doScroll("left") } catch (a) { setTimeout(ma, 1); return } c.ready() } } function Qa(a, b) { b.src ? c.ajax({ url: b.src, async: false, dataType: "script" }) : c.globalEval(b.text || b.textContent || b.innerHTML || ""); b.parentNode && b.parentNode.removeChild(b) } function X(a, b, d, f, e, j) { + var i = a.length; if (typeof b === "object") { for (var o in b) X(a, o, b[o], f, e, d); return a } if (d !== w) { f = !j && f && c.isFunction(d); for (o = 0; o < i; o++) e(a[o], b, f ? d.call(a[o], o, e(a[o], b)) : d, j); return a } return i ? +e(a[0], b) : w + } function J() { return (new Date).getTime() } function Y() { return false } function Z() { return true } function na(a, b, d) { d[0].type = a; return c.event.handle.apply(b, d) } function oa(a) { + var b, d = [], f = [], e = arguments, j, i, o, k, n, r; i = c.data(this, "events"); if (!(a.liveFired === this || !i || !i.live || a.button && a.type === "click")) { + a.liveFired = this; var u = i.live.slice(0); for (k = 0; k < u.length; k++) { i = u[k]; i.origType.replace(O, "") === a.type ? f.push(i.selector) : u.splice(k--, 1) } j = c(a.target).closest(f, a.currentTarget); n = 0; for (r = +j.length; n < r; n++) for (k = 0; k < u.length; k++) { i = u[k]; if (j[n].selector === i.selector) { o = j[n].elem; f = null; if (i.preType === "mouseenter" || i.preType === "mouseleave") f = c(a.relatedTarget).closest(i.selector)[0]; if (!f || f !== o) d.push({ elem: o, handleObj: i }) } } n = 0; for (r = d.length; n < r; n++) { j = d[n]; a.currentTarget = j.elem; a.data = j.handleObj.data; a.handleObj = j.handleObj; if (j.handleObj.origHandler.apply(j.elem, e) === false) { b = false; break } } return b + } + } function pa(a, b) { + return "live." + (a && a !== "*" ? a + "." : "") + b.replace(/\./g, "`").replace(/ /g, +"&") + } function qa(a) { return !a || !a.parentNode || a.parentNode.nodeType === 11 } function ra(a, b) { var d = 0; b.each(function() { if (this.nodeName === (a[d] && a[d].nodeName)) { var f = c.data(a[d++]), e = c.data(this, f); if (f = f && f.events) { delete e.handle; e.events = {}; for (var j in f) for (var i in f[j]) c.event.add(this, j, f[j][i], f[j][i].data) } } }) } function sa(a, b, d) { + var f, e, j; b = b && b[0] ? b[0].ownerDocument || b[0] : s; if (a.length === 1 && typeof a[0] === "string" && a[0].length < 512 && b === s && !ta.test(a[0]) && (c.support.checkClone || !ua.test(a[0]))) { + e = +true; if (j = c.fragments[a[0]]) if (j !== 1) f = j + } if (!f) { f = b.createDocumentFragment(); c.clean(a, b, f, d) } if (e) c.fragments[a[0]] = j ? f : 1; return { fragment: f, cacheable: e} + } function K(a, b) { var d = {}; c.each(va.concat.apply([], va.slice(0, b)), function() { d[this] = a }); return d } function wa(a) { return "scrollTo" in a && a.document ? a : a.nodeType === 9 ? a.defaultView || a.parentWindow : false } var c = function(a, b) { return new c.fn.init(a, b) }, Ra = A.jQuery, Sa = A.$, s = A.document, T, Ta = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, Ua = /^.[^:#\[\.,]*$/, Va = /\S/, +Wa = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, Xa = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, P = navigator.userAgent, xa = false, Q = [], L, $ = Object.prototype.toString, aa = Object.prototype.hasOwnProperty, ba = Array.prototype.push, R = Array.prototype.slice, ya = Array.prototype.indexOf; c.fn = c.prototype = { init: function(a, b) { + var d, f; if (!a) return this; if (a.nodeType) { this.context = this[0] = a; this.length = 1; return this } if (a === "body" && !b) { this.context = s; this[0] = s.body; this.selector = "body"; this.length = 1; return this } if (typeof a === "string") if ((d = Ta.exec(a)) && +(d[1] || !b)) if (d[1]) { f = b ? b.ownerDocument || b : s; if (a = Xa.exec(a)) if (c.isPlainObject(b)) { a = [s.createElement(a[1])]; c.fn.attr.call(a, b, true) } else a = [f.createElement(a[1])]; else { a = sa([d[1]], [f]); a = (a.cacheable ? a.fragment.cloneNode(true) : a.fragment).childNodes } return c.merge(this, a) } else { if (b = s.getElementById(d[2])) { if (b.id !== d[2]) return T.find(a); this.length = 1; this[0] = b } this.context = s; this.selector = a; return this } else if (!b && /^\w+$/.test(a)) { + this.selector = a; this.context = s; a = s.getElementsByTagName(a); return c.merge(this, +a) + } else return !b || b.jquery ? (b || T).find(a) : c(b).find(a); else if (c.isFunction(a)) return T.ready(a); if (a.selector !== w) { this.selector = a.selector; this.context = a.context } return c.makeArray(a, this) +}, selector: "", jquery: "1.4.2", length: 0, size: function() { return this.length }, toArray: function() { return R.call(this, 0) }, get: function(a) { return a == null ? this.toArray() : a < 0 ? this.slice(a)[0] : this[a] }, pushStack: function(a, b, d) { + var f = c(); c.isArray(a) ? ba.apply(f, a) : c.merge(f, a); f.prevObject = this; f.context = this.context; if (b === +"find") f.selector = this.selector + (this.selector ? " " : "") + d; else if (b) f.selector = this.selector + "." + b + "(" + d + ")"; return f +}, each: function(a, b) { return c.each(this, a, b) }, ready: function(a) { c.bindReady(); if (c.isReady) a.call(s, c); else Q && Q.push(a); return this }, eq: function(a) { return a === -1 ? this.slice(a) : this.slice(a, +a + 1) }, first: function() { return this.eq(0) }, last: function() { return this.eq(-1) }, slice: function() { return this.pushStack(R.apply(this, arguments), "slice", R.call(arguments).join(",")) }, map: function(a) { + return this.pushStack(c.map(this, +function(b, d) { return a.call(b, d, b) })) +}, end: function() { return this.prevObject || c(null) }, push: ba, sort: [].sort, splice: [].splice +}; c.fn.init.prototype = c.fn; c.extend = c.fn.extend = function() { + var a = arguments[0] || {}, b = 1, d = arguments.length, f = false, e, j, i, o; if (typeof a === "boolean") { f = a; a = arguments[1] || {}; b = 2 } if (typeof a !== "object" && !c.isFunction(a)) a = {}; if (d === b) { a = this; --b } for (; b < d; b++) if ((e = arguments[b]) != null) for (j in e) { + i = a[j]; o = e[j]; if (a !== o) if (f && o && (c.isPlainObject(o) || c.isArray(o))) { + i = i && (c.isPlainObject(i) || +c.isArray(i)) ? i : c.isArray(o) ? [] : {}; a[j] = c.extend(f, i, o) + } else if (o !== w) a[j] = o + } return a +}; c.extend({ noConflict: function(a) { A.$ = Sa; if (a) A.jQuery = Ra; return c }, isReady: false, ready: function() { if (!c.isReady) { if (!s.body) return setTimeout(c.ready, 13); c.isReady = true; if (Q) { for (var a, b = 0; a = Q[b++]; ) a.call(s, c); Q = null } c.fn.triggerHandler && c(s).triggerHandler("ready") } }, bindReady: function() { + if (!xa) { + xa = true; if (s.readyState === "complete") return c.ready(); if (s.addEventListener) { + s.addEventListener("DOMContentLoaded", +L, false); A.addEventListener("load", c.ready, false) + } else if (s.attachEvent) { s.attachEvent("onreadystatechange", L); A.attachEvent("onload", c.ready); var a = false; try { a = A.frameElement == null } catch (b) { } s.documentElement.doScroll && a && ma() } + } +}, isFunction: function(a) { return $.call(a) === "[object Function]" }, isArray: function(a) { return $.call(a) === "[object Array]" }, isPlainObject: function(a) { + if (!a || $.call(a) !== "[object Object]" || a.nodeType || a.setInterval) return false; if (a.constructor && !aa.call(a, "constructor") && !aa.call(a.constructor.prototype, +"isPrototypeOf")) return false; var b; for (b in a); return b === w || aa.call(a, b) +}, isEmptyObject: function(a) { for (var b in a) return false; return true }, error: function(a) { throw a; }, parseJSON: function(a) { + if (typeof a !== "string" || !a) return null; a = c.trim(a); if (/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return A.JSON && A.JSON.parse ? A.JSON.parse(a) : (new Function("return " + +a))(); else c.error("Invalid JSON: " + a) +}, noop: function() { }, globalEval: function(a) { if (a && Va.test(a)) { var b = s.getElementsByTagName("head")[0] || s.documentElement, d = s.createElement("script"); d.type = "text/javascript"; if (c.support.scriptEval) d.appendChild(s.createTextNode(a)); else d.text = a; b.insertBefore(d, b.firstChild); b.removeChild(d) } }, nodeName: function(a, b) { return a.nodeName && a.nodeName.toUpperCase() === b.toUpperCase() }, each: function(a, b, d) { + var f, e = 0, j = a.length, i = j === w || c.isFunction(a); if (d) if (i) for (f in a) { + if (b.apply(a[f], +d) === false) break + } else for (; e < j; ) { if (b.apply(a[e++], d) === false) break } else if (i) for (f in a) { if (b.call(a[f], f, a[f]) === false) break } else for (d = a[0]; e < j && b.call(d, e, d) !== false; d = a[++e]); return a +}, trim: function(a) { return (a || "").replace(Wa, "") }, makeArray: function(a, b) { b = b || []; if (a != null) a.length == null || typeof a === "string" || c.isFunction(a) || typeof a !== "function" && a.setInterval ? ba.call(b, a) : c.merge(b, a); return b }, inArray: function(a, b) { + if (b.indexOf) return b.indexOf(a); for (var d = 0, f = b.length; d < f; d++) if (b[d] === +a) return d; return -1 +}, merge: function(a, b) { var d = a.length, f = 0; if (typeof b.length === "number") for (var e = b.length; f < e; f++) a[d++] = b[f]; else for (; b[f] !== w; ) a[d++] = b[f++]; a.length = d; return a }, grep: function(a, b, d) { for (var f = [], e = 0, j = a.length; e < j; e++) !d !== !b(a[e], e) && f.push(a[e]); return f }, map: function(a, b, d) { for (var f = [], e, j = 0, i = a.length; j < i; j++) { e = b(a[j], j, d); if (e != null) f[f.length] = e } return f.concat.apply([], f) }, guid: 1, proxy: function(a, b, d) { + if (arguments.length === 2) if (typeof b === "string") { d = a; a = d[b]; b = w } else if (b && +!c.isFunction(b)) { d = b; b = w } if (!b && a) b = function() { return a.apply(d || this, arguments) }; if (a) b.guid = a.guid = a.guid || b.guid || c.guid++; return b +}, uaMatch: function(a) { a = a.toLowerCase(); a = /(webkit)[ \/]([\w.]+)/.exec(a) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a) || /(msie) ([\w.]+)/.exec(a) || !/compatible/.test(a) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(a) || []; return { browser: a[1] || "", version: a[2] || "0"} }, browser: {} +}); P = c.uaMatch(P); if (P.browser) { c.browser[P.browser] = true; c.browser.version = P.version } if (c.browser.webkit) c.browser.safari = +true; if (ya) c.inArray = function(a, b) { return ya.call(b, a) }; T = c(s); if (s.addEventListener) L = function() { s.removeEventListener("DOMContentLoaded", L, false); c.ready() }; else if (s.attachEvent) L = function() { if (s.readyState === "complete") { s.detachEvent("onreadystatechange", L); c.ready() } }; (function() { + c.support = {}; var a = s.documentElement, b = s.createElement("script"), d = s.createElement("div"), f = "script" + J(); d.style.display = "none"; d.innerHTML = "
    a"; + var e = d.getElementsByTagName("*"), j = d.getElementsByTagName("a")[0]; if (!(!e || !e.length || !j)) { + c.support = { leadingWhitespace: d.firstChild.nodeType === 3, tbody: !d.getElementsByTagName("tbody").length, htmlSerialize: !!d.getElementsByTagName("link").length, style: /red/.test(j.getAttribute("style")), hrefNormalized: j.getAttribute("href") === "/a", opacity: /^0.55$/.test(j.style.opacity), cssFloat: !!j.style.cssFloat, checkOn: d.getElementsByTagName("input")[0].value === "on", optSelected: s.createElement("select").appendChild(s.createElement("option")).selected, + parentNode: d.removeChild(d.appendChild(s.createElement("div"))).parentNode === null, deleteExpando: true, checkClone: false, scriptEval: false, noCloneEvent: true, boxModel: null + }; b.type = "text/javascript"; try { b.appendChild(s.createTextNode("window." + f + "=1;")) } catch (i) { } a.insertBefore(b, a.firstChild); if (A[f]) { c.support.scriptEval = true; delete A[f] } try { delete b.test } catch (o) { c.support.deleteExpando = false } a.removeChild(b); if (d.attachEvent && d.fireEvent) { + d.attachEvent("onclick", function k() { + c.support.noCloneEvent = +false; d.detachEvent("onclick", k) + }); d.cloneNode(true).fireEvent("onclick") + } d = s.createElement("div"); d.innerHTML = ""; a = s.createDocumentFragment(); a.appendChild(d.firstChild); c.support.checkClone = a.cloneNode(true).cloneNode(true).lastChild.checked; c(function() { var k = s.createElement("div"); k.style.width = k.style.paddingLeft = "1px"; s.body.appendChild(k); c.boxModel = c.support.boxModel = k.offsetWidth === 2; s.body.removeChild(k).style.display = "none" }); a = function(k) { + var n = +s.createElement("div"); k = "on" + k; var r = k in n; if (!r) { n.setAttribute(k, "return;"); r = typeof n[k] === "function" } return r + }; c.support.submitBubbles = a("submit"); c.support.changeBubbles = a("change"); a = b = d = e = j = null + } +})(); c.props = { "for": "htmlFor", "class": "className", readonly: "readOnly", maxlength: "maxLength", cellspacing: "cellSpacing", rowspan: "rowSpan", colspan: "colSpan", tabindex: "tabIndex", usemap: "useMap", frameborder: "frameBorder" }; var G = "jQuery" + J(), Ya = 0, za = {}; c.extend({ cache: {}, expando: G, noData: { embed: true, object: true, + applet: true +}, data: function(a, b, d) { if (!(a.nodeName && c.noData[a.nodeName.toLowerCase()])) { a = a == A ? za : a; var f = a[G], e = c.cache; if (!f && typeof b === "string" && d === w) return null; f || (f = ++Ya); if (typeof b === "object") { a[G] = f; e[f] = c.extend(true, {}, b) } else if (!e[f]) { a[G] = f; e[f] = {} } a = e[f]; if (d !== w) a[b] = d; return typeof b === "string" ? a[b] : a } }, removeData: function(a, b) { + if (!(a.nodeName && c.noData[a.nodeName.toLowerCase()])) { + a = a == A ? za : a; var d = a[G], f = c.cache, e = f[d]; if (b) { if (e) { delete e[b]; c.isEmptyObject(e) && c.removeData(a) } } else { + if (c.support.deleteExpando) delete a[c.expando]; + else a.removeAttribute && a.removeAttribute(c.expando); delete f[d] + } + } +} +}); c.fn.extend({ data: function(a, b) { + if (typeof a === "undefined" && this.length) return c.data(this[0]); else if (typeof a === "object") return this.each(function() { c.data(this, a) }); var d = a.split("."); d[1] = d[1] ? "." + d[1] : ""; if (b === w) { var f = this.triggerHandler("getData" + d[1] + "!", [d[0]]); if (f === w && this.length) f = c.data(this[0], a); return f === w && d[1] ? this.data(d[0]) : f } else return this.trigger("setData" + d[1] + "!", [d[0], b]).each(function() { + c.data(this, +a, b) + }) +}, removeData: function(a) { return this.each(function() { c.removeData(this, a) }) } +}); c.extend({ queue: function(a, b, d) { if (a) { b = (b || "fx") + "queue"; var f = c.data(a, b); if (!d) return f || []; if (!f || c.isArray(d)) f = c.data(a, b, c.makeArray(d)); else f.push(d); return f } }, dequeue: function(a, b) { b = b || "fx"; var d = c.queue(a, b), f = d.shift(); if (f === "inprogress") f = d.shift(); if (f) { b === "fx" && d.unshift("inprogress"); f.call(a, function() { c.dequeue(a, b) }) } } }); c.fn.extend({ queue: function(a, b) { + if (typeof a !== "string") { b = a; a = "fx" } if (b === +w) return c.queue(this[0], a); return this.each(function() { var d = c.queue(this, a, b); a === "fx" && d[0] !== "inprogress" && c.dequeue(this, a) }) +}, dequeue: function(a) { return this.each(function() { c.dequeue(this, a) }) }, delay: function(a, b) { a = c.fx ? c.fx.speeds[a] || a : a; b = b || "fx"; return this.queue(b, function() { var d = this; setTimeout(function() { c.dequeue(d, b) }, a) }) }, clearQueue: function(a) { return this.queue(a || "fx", []) } +}); var Aa = /[\n\t]/g, ca = /\s+/, Za = /\r/g, $a = /href|src|style/, ab = /(button|input)/i, bb = /(button|input|object|select|textarea)/i, +cb = /^(a|area)$/i, Ba = /radio|checkbox/; c.fn.extend({ attr: function(a, b) { return X(this, a, b, true, c.attr) }, removeAttr: function(a) { return this.each(function() { c.attr(this, a, ""); this.nodeType === 1 && this.removeAttribute(a) }) }, addClass: function(a) { + if (c.isFunction(a)) return this.each(function(n) { var r = c(this); r.addClass(a.call(this, n, r.attr("class"))) }); if (a && typeof a === "string") for (var b = (a || "").split(ca), d = 0, f = this.length; d < f; d++) { + var e = this[d]; if (e.nodeType === 1) if (e.className) { + for (var j = " " + e.className + " ", +i = e.className, o = 0, k = b.length; o < k; o++) if (j.indexOf(" " + b[o] + " ") < 0) i += " " + b[o]; e.className = c.trim(i) + } else e.className = a + } return this +}, removeClass: function(a) { + if (c.isFunction(a)) return this.each(function(k) { var n = c(this); n.removeClass(a.call(this, k, n.attr("class"))) }); if (a && typeof a === "string" || a === w) for (var b = (a || "").split(ca), d = 0, f = this.length; d < f; d++) { + var e = this[d]; if (e.nodeType === 1 && e.className) if (a) { + for (var j = (" " + e.className + " ").replace(Aa, " "), i = 0, o = b.length; i < o; i++) j = j.replace(" " + b[i] + " ", +" "); e.className = c.trim(j) + } else e.className = "" + } return this +}, toggleClass: function(a, b) { + var d = typeof a, f = typeof b === "boolean"; if (c.isFunction(a)) return this.each(function(e) { var j = c(this); j.toggleClass(a.call(this, e, j.attr("class"), b), b) }); return this.each(function() { + if (d === "string") for (var e, j = 0, i = c(this), o = b, k = a.split(ca); e = k[j++]; ) { o = f ? o : !i.hasClass(e); i[o ? "addClass" : "removeClass"](e) } else if (d === "undefined" || d === "boolean") { + this.className && c.data(this, "__className__", this.className); this.className = +this.className || a === false ? "" : c.data(this, "__className__") || "" + } + }) +}, hasClass: function(a) { a = " " + a + " "; for (var b = 0, d = this.length; b < d; b++) if ((" " + this[b].className + " ").replace(Aa, " ").indexOf(a) > -1) return true; return false }, val: function(a) { + if (a === w) { + var b = this[0]; if (b) { + if (c.nodeName(b, "option")) return (b.attributes.value || {}).specified ? b.value : b.text; if (c.nodeName(b, "select")) { + var d = b.selectedIndex, f = [], e = b.options; b = b.type === "select-one"; if (d < 0) return null; var j = b ? d : 0; for (d = b ? d + 1 : e.length; j < d; j++) { + var i = +e[j]; if (i.selected) { a = c(i).val(); if (b) return a; f.push(a) } + } return f + } if (Ba.test(b.type) && !c.support.checkOn) return b.getAttribute("value") === null ? "on" : b.value; return (b.value || "").replace(Za, "") + } return w + } var o = c.isFunction(a); return this.each(function(k) { + var n = c(this), r = a; if (this.nodeType === 1) { + if (o) r = a.call(this, k, n.val()); if (typeof r === "number") r += ""; if (c.isArray(r) && Ba.test(this.type)) this.checked = c.inArray(n.val(), r) >= 0; else if (c.nodeName(this, "select")) { + var u = c.makeArray(r); c("option", this).each(function() { + this.selected = +c.inArray(c(this).val(), u) >= 0 + }); if (!u.length) this.selectedIndex = -1 + } else this.value = r + } + }) +} +}); c.extend({ attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function(a, b, d, f) { + if (!a || a.nodeType === 3 || a.nodeType === 8) return w; if (f && b in c.attrFn) return c(a)[b](d); f = a.nodeType !== 1 || !c.isXMLDoc(a); var e = d !== w; b = f && c.props[b] || b; if (a.nodeType === 1) { + var j = $a.test(b); if (b in a && f && !j) { + if (e) { + b === "type" && ab.test(a.nodeName) && a.parentNode && c.error("type property can't be changed"); + a[b] = d + } if (c.nodeName(a, "form") && a.getAttributeNode(b)) return a.getAttributeNode(b).nodeValue; if (b === "tabIndex") return (b = a.getAttributeNode("tabIndex")) && b.specified ? b.value : bb.test(a.nodeName) || cb.test(a.nodeName) && a.href ? 0 : w; return a[b] + } if (!c.support.style && f && b === "style") { if (e) a.style.cssText = "" + d; return a.style.cssText } e && a.setAttribute(b, "" + d); a = !c.support.hrefNormalized && f && j ? a.getAttribute(b, 2) : a.getAttribute(b); return a === null ? w : a + } return c.style(a, b, d) +} +}); var O = /\.(.*)$/, db = function(a) { + return a.replace(/[^\w\s\.\|`]/g, +function(b) { return "\\" + b }) +}; c.event = { add: function(a, b, d, f) { + if (!(a.nodeType === 3 || a.nodeType === 8)) { + if (a.setInterval && a !== A && !a.frameElement) a = A; var e, j; if (d.handler) { e = d; d = e.handler } if (!d.guid) d.guid = c.guid++; if (j = c.data(a)) { + var i = j.events = j.events || {}, o = j.handle; if (!o) j.handle = o = function() { return typeof c !== "undefined" && !c.event.triggered ? c.event.handle.apply(o.elem, arguments) : w }; o.elem = a; b = b.split(" "); for (var k, n = 0, r; k = b[n++]; ) { + j = e ? c.extend({}, e) : { handler: d, data: f }; if (k.indexOf(".") > -1) { + r = k.split("."); + k = r.shift(); j.namespace = r.slice(0).sort().join(".") + } else { r = []; j.namespace = "" } j.type = k; j.guid = d.guid; var u = i[k], z = c.event.special[k] || {}; if (!u) { u = i[k] = []; if (!z.setup || z.setup.call(a, f, r, o) === false) if (a.addEventListener) a.addEventListener(k, o, false); else a.attachEvent && a.attachEvent("on" + k, o) } if (z.add) { z.add.call(a, j); if (!j.handler.guid) j.handler.guid = d.guid } u.push(j); c.event.global[k] = true + } a = null + } + } +}, global: {}, remove: function(a, b, d, f) { + if (!(a.nodeType === 3 || a.nodeType === 8)) { + var e, j = 0, i, o, k, n, r, u, z = c.data(a), +C = z && z.events; if (z && C) { + if (b && b.type) { d = b.handler; b = b.type } if (!b || typeof b === "string" && b.charAt(0) === ".") { b = b || ""; for (e in C) c.event.remove(a, e + b) } else { + for (b = b.split(" "); e = b[j++]; ) { + n = e; i = e.indexOf(".") < 0; o = []; if (!i) { o = e.split("."); e = o.shift(); k = new RegExp("(^|\\.)" + c.map(o.slice(0).sort(), db).join("\\.(?:.*\\.)?") + "(\\.|$)") } if (r = C[e]) if (d) { + n = c.event.special[e] || {}; for (B = f || 0; B < r.length; B++) { + u = r[B]; if (d.guid === u.guid) { + if (i || k.test(u.namespace)) { f == null && r.splice(B--, 1); n.remove && n.remove.call(a, u) } if (f != +null) break + } + } if (r.length === 0 || f != null && r.length === 1) { if (!n.teardown || n.teardown.call(a, o) === false) Ca(a, e, z.handle); delete C[e] } + } else for (var B = 0; B < r.length; B++) { u = r[B]; if (i || k.test(u.namespace)) { c.event.remove(a, n, u.handler, B); r.splice(B--, 1) } } + } if (c.isEmptyObject(C)) { if (b = z.handle) b.elem = null; delete z.events; delete z.handle; c.isEmptyObject(z) && c.removeData(a) } + } + } + } +}, trigger: function(a, b, d, f) { + var e = a.type || a; if (!f) { + a = typeof a === "object" ? a[G] ? a : c.extend(c.Event(e), a) : c.Event(e); if (e.indexOf("!") >= 0) { + a.type = +e = e.slice(0, -1); a.exclusive = true + } if (!d) { a.stopPropagation(); c.event.global[e] && c.each(c.cache, function() { this.events && this.events[e] && c.event.trigger(a, b, this.handle.elem) }) } if (!d || d.nodeType === 3 || d.nodeType === 8) return w; a.result = w; a.target = d; b = c.makeArray(b); b.unshift(a) + } a.currentTarget = d; (f = c.data(d, "handle")) && f.apply(d, b); f = d.parentNode || d.ownerDocument; try { if (!(d && d.nodeName && c.noData[d.nodeName.toLowerCase()])) if (d["on" + e] && d["on" + e].apply(d, b) === false) a.result = false } catch (j) { } if (!a.isPropagationStopped() && +f) c.event.trigger(a, b, f, true); else if (!a.isDefaultPrevented()) { f = a.target; var i, o = c.nodeName(f, "a") && e === "click", k = c.event.special[e] || {}; if ((!k._default || k._default.call(d, a) === false) && !o && !(f && f.nodeName && c.noData[f.nodeName.toLowerCase()])) { try { if (f[e]) { if (i = f["on" + e]) f["on" + e] = null; c.event.triggered = true; f[e]() } } catch (n) { } if (i) f["on" + e] = i; c.event.triggered = false } } +}, handle: function(a) { + var b, d, f, e; a = arguments[0] = c.event.fix(a || A.event); a.currentTarget = this; b = a.type.indexOf(".") < 0 && !a.exclusive; + if (!b) { d = a.type.split("."); a.type = d.shift(); f = new RegExp("(^|\\.)" + d.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)") } e = c.data(this, "events"); d = e[a.type]; if (e && d) { d = d.slice(0); e = 0; for (var j = d.length; e < j; e++) { var i = d[e]; if (b || f.test(i.namespace)) { a.handler = i.handler; a.data = i.data; a.handleObj = i; i = i.handler.apply(this, arguments); if (i !== w) { a.result = i; if (i === false) { a.preventDefault(); a.stopPropagation() } } if (a.isImmediatePropagationStopped()) break } } } return a.result +}, props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + fix: function(a) { + if (a[G]) return a; var b = a; a = c.Event(b); for (var d = this.props.length, f; d; ) { f = this.props[--d]; a[f] = b[f] } if (!a.target) a.target = a.srcElement || s; if (a.target.nodeType === 3) a.target = a.target.parentNode; if (!a.relatedTarget && a.fromElement) a.relatedTarget = a.fromElement === a.target ? a.toElement : a.fromElement; if (a.pageX == null && a.clientX != null) { + b = s.documentElement; d = s.body; a.pageX = a.clientX + (b && b.scrollLeft || d && d.scrollLeft || 0) - (b && b.clientLeft || d && d.clientLeft || 0); a.pageY = a.clientY + (b && b.scrollTop || +d && d.scrollTop || 0) - (b && b.clientTop || d && d.clientTop || 0) + } if (!a.which && (a.charCode || a.charCode === 0 ? a.charCode : a.keyCode)) a.which = a.charCode || a.keyCode; if (!a.metaKey && a.ctrlKey) a.metaKey = a.ctrlKey; if (!a.which && a.button !== w) a.which = a.button & 1 ? 1 : a.button & 2 ? 3 : a.button & 4 ? 2 : 0; return a + }, guid: 1E8, proxy: c.proxy, special: { ready: { setup: c.bindReady, teardown: c.noop }, live: { add: function(a) { c.event.add(this, a.origType, c.extend({}, a, { handler: oa })) }, remove: function(a) { + var b = true, d = a.origType.replace(O, ""); c.each(c.data(this, +"events").live || [], function() { if (d === this.origType.replace(O, "")) return b = false }); b && c.event.remove(this, a.origType, oa) + } + }, beforeunload: { setup: function(a, b, d) { if (this.setInterval) this.onbeforeunload = d; return false }, teardown: function(a, b) { if (this.onbeforeunload === b) this.onbeforeunload = null } }} + }; var Ca = s.removeEventListener ? function(a, b, d) { a.removeEventListener(b, d, false) } : function(a, b, d) { a.detachEvent("on" + b, d) }; c.Event = function(a) { + if (!this.preventDefault) return new c.Event(a); if (a && a.type) { + this.originalEvent = +a; this.type = a.type + } else this.type = a; this.timeStamp = J(); this[G] = true + }; c.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = Z; var a = this.originalEvent; if (a) { a.preventDefault && a.preventDefault(); a.returnValue = false } }, stopPropagation: function() { this.isPropagationStopped = Z; var a = this.originalEvent; if (a) { a.stopPropagation && a.stopPropagation(); a.cancelBubble = true } }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = Z; this.stopPropagation() }, isDefaultPrevented: Y, isPropagationStopped: Y, + isImmediatePropagationStopped: Y + }; var Da = function(a) { var b = a.relatedTarget; try { for (; b && b !== this; ) b = b.parentNode; if (b !== this) { a.type = a.data; c.event.handle.apply(this, arguments) } } catch (d) { } }, Ea = function(a) { a.type = a.data; c.event.handle.apply(this, arguments) }; c.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function(a, b) { c.event.special[a] = { setup: function(d) { c.event.add(this, b, d && d.selector ? Ea : Da, a) }, teardown: function(d) { c.event.remove(this, b, d && d.selector ? Ea : Da) } } }); if (!c.support.submitBubbles) c.event.special.submit = +{ setup: function() { if (this.nodeName.toLowerCase() !== "form") { c.event.add(this, "click.specialSubmit", function(a) { var b = a.target, d = b.type; if ((d === "submit" || d === "image") && c(b).closest("form").length) return na("submit", this, arguments) }); c.event.add(this, "keypress.specialSubmit", function(a) { var b = a.target, d = b.type; if ((d === "text" || d === "password") && c(b).closest("form").length && a.keyCode === 13) return na("submit", this, arguments) }) } else return false }, teardown: function() { c.event.remove(this, ".specialSubmit") } }; + if (!c.support.changeBubbles) { + var da = /textarea|input|select/i, ea, Fa = function(a) { var b = a.type, d = a.value; if (b === "radio" || b === "checkbox") d = a.checked; else if (b === "select-multiple") d = a.selectedIndex > -1 ? c.map(a.options, function(f) { return f.selected }).join("-") : ""; else if (a.nodeName.toLowerCase() === "select") d = a.selectedIndex; return d }, fa = function(a, b) { + var d = a.target, f, e; if (!(!da.test(d.nodeName) || d.readOnly)) { + f = c.data(d, "_change_data"); e = Fa(d); if (a.type !== "focusout" || d.type !== "radio") c.data(d, "_change_data", +e); if (!(f === w || e === f)) if (f != null || e) { a.type = "change"; return c.event.trigger(a, b, d) } + } + }; c.event.special.change = { filters: { focusout: fa, click: function(a) { var b = a.target, d = b.type; if (d === "radio" || d === "checkbox" || b.nodeName.toLowerCase() === "select") return fa.call(this, a) }, keydown: function(a) { var b = a.target, d = b.type; if (a.keyCode === 13 && b.nodeName.toLowerCase() !== "textarea" || a.keyCode === 32 && (d === "checkbox" || d === "radio") || d === "select-multiple") return fa.call(this, a) }, beforeactivate: function(a) { + a = a.target; c.data(a, +"_change_data", Fa(a)) + } + }, setup: function() { if (this.type === "file") return false; for (var a in ea) c.event.add(this, a + ".specialChange", ea[a]); return da.test(this.nodeName) }, teardown: function() { c.event.remove(this, ".specialChange"); return da.test(this.nodeName) } + }; ea = c.event.special.change.filters + } s.addEventListener && c.each({ focus: "focusin", blur: "focusout" }, function(a, b) { + function d(f) { f = c.event.fix(f); f.type = b; return c.event.handle.call(this, f) } c.event.special[b] = { setup: function() { + this.addEventListener(a, +d, true) + }, teardown: function() { this.removeEventListener(a, d, true) } } + }); c.each(["bind", "one"], function(a, b) { c.fn[b] = function(d, f, e) { if (typeof d === "object") { for (var j in d) this[b](j, f, d[j], e); return this } if (c.isFunction(f)) { e = f; f = w } var i = b === "one" ? c.proxy(e, function(k) { c(this).unbind(k, i); return e.apply(this, arguments) }) : e; if (d === "unload" && b !== "one") this.one(d, f, e); else { j = 0; for (var o = this.length; j < o; j++) c.event.add(this[j], d, i, f) } return this } }); c.fn.extend({ unbind: function(a, b) { + if (typeof a === "object" && +!a.preventDefault) for (var d in a) this.unbind(d, a[d]); else { d = 0; for (var f = this.length; d < f; d++) c.event.remove(this[d], a, b) } return this + }, delegate: function(a, b, d, f) { return this.live(b, d, f, a) }, undelegate: function(a, b, d) { return arguments.length === 0 ? this.unbind("live") : this.die(b, null, d, a) }, trigger: function(a, b) { return this.each(function() { c.event.trigger(a, b, this) }) }, triggerHandler: function(a, b) { if (this[0]) { a = c.Event(a); a.preventDefault(); a.stopPropagation(); c.event.trigger(a, b, this[0]); return a.result } }, + toggle: function(a) { for (var b = arguments, d = 1; d < b.length; ) c.proxy(a, b[d++]); return this.click(c.proxy(a, function(f) { var e = (c.data(this, "lastToggle" + a.guid) || 0) % d; c.data(this, "lastToggle" + a.guid, e + 1); f.preventDefault(); return b[e].apply(this, arguments) || false })) }, hover: function(a, b) { return this.mouseenter(a).mouseleave(b || a) } + }); var Ga = { focus: "focusin", blur: "focusout", mouseenter: "mouseover", mouseleave: "mouseout" }; c.each(["live", "die"], function(a, b) { + c.fn[b] = function(d, f, e, j) { + var i, o = 0, k, n, r = j || this.selector, +u = j ? this : c(this.context); if (c.isFunction(f)) { e = f; f = w } for (d = (d || "").split(" "); (i = d[o++]) != null; ) { j = O.exec(i); k = ""; if (j) { k = j[0]; i = i.replace(O, "") } if (i === "hover") d.push("mouseenter" + k, "mouseleave" + k); else { n = i; if (i === "focus" || i === "blur") { d.push(Ga[i] + k); i += k } else i = (Ga[i] || i) + k; b === "live" ? u.each(function() { c.event.add(this, pa(i, r), { data: f, selector: r, handler: e, origType: i, origHandler: e, preType: n }) }) : u.unbind(pa(i, r), e) } } return this + } + }); c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), +function(a, b) { c.fn[b] = function(d) { return d ? this.bind(b, d) : this.trigger(b) }; if (c.attrFn) c.attrFn[b] = true }); A.attachEvent && !A.addEventListener && A.attachEvent("onunload", function() { for (var a in c.cache) if (c.cache[a].handle) try { c.event.remove(c.cache[a].handle.elem) } catch (b) { } }); (function() { + function a(g) { for (var h = "", l, m = 0; g[m]; m++) { l = g[m]; if (l.nodeType === 3 || l.nodeType === 4) h += l.nodeValue; else if (l.nodeType !== 8) h += a(l.childNodes) } return h } function b(g, h, l, m, q, p) { + q = 0; for (var v = m.length; q < v; q++) { + var t = m[q]; + if (t) { t = t[g]; for (var y = false; t; ) { if (t.sizcache === l) { y = m[t.sizset]; break } if (t.nodeType === 1 && !p) { t.sizcache = l; t.sizset = q } if (t.nodeName.toLowerCase() === h) { y = t; break } t = t[g] } m[q] = y } + } + } function d(g, h, l, m, q, p) { q = 0; for (var v = m.length; q < v; q++) { var t = m[q]; if (t) { t = t[g]; for (var y = false; t; ) { if (t.sizcache === l) { y = m[t.sizset]; break } if (t.nodeType === 1) { if (!p) { t.sizcache = l; t.sizset = q } if (typeof h !== "string") { if (t === h) { y = true; break } } else if (k.filter(h, [t]).length > 0) { y = t; break } } t = t[g] } m[q] = y } } } var f = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e = 0, j = Object.prototype.toString, i = false, o = true; [0, 0].sort(function() { o = false; return 0 }); var k = function(g, h, l, m) { + l = l || []; var q = h = h || s; if (h.nodeType !== 1 && h.nodeType !== 9) return []; if (!g || typeof g !== "string") return l; for (var p = [], v, t, y, S, H = true, M = x(h), I = g; (f.exec(""), v = f.exec(I)) !== null; ) { I = v[3]; p.push(v[1]); if (v[2]) { S = v[3]; break } } if (p.length > 1 && r.exec(g)) if (p.length === 2 && n.relative[p[0]]) t = ga(p[0] + p[1], h); else for (t = n.relative[p[0]] ? [h] : k(p.shift(), h); p.length; ) { + g = p.shift(); if (n.relative[g]) g += p.shift(); + t = ga(g, t) + } else { if (!m && p.length > 1 && h.nodeType === 9 && !M && n.match.ID.test(p[0]) && !n.match.ID.test(p[p.length - 1])) { v = k.find(p.shift(), h, M); h = v.expr ? k.filter(v.expr, v.set)[0] : v.set[0] } if (h) { v = m ? { expr: p.pop(), set: z(m)} : k.find(p.pop(), p.length === 1 && (p[0] === "~" || p[0] === "+") && h.parentNode ? h.parentNode : h, M); t = v.expr ? k.filter(v.expr, v.set) : v.set; if (p.length > 0) y = z(t); else H = false; for (; p.length; ) { var D = p.pop(); v = D; if (n.relative[D]) v = p.pop(); else D = ""; if (v == null) v = h; n.relative[D](y, v, M) } } else y = [] } y || (y = t); y || k.error(D || +g); if (j.call(y) === "[object Array]") if (H) if (h && h.nodeType === 1) for (g = 0; y[g] != null; g++) { if (y[g] && (y[g] === true || y[g].nodeType === 1 && E(h, y[g]))) l.push(t[g]) } else for (g = 0; y[g] != null; g++) y[g] && y[g].nodeType === 1 && l.push(t[g]); else l.push.apply(l, y); else z(y, l); if (S) { k(S, q, l, m); k.uniqueSort(l) } return l +}; k.uniqueSort = function(g) { if (B) { i = o; g.sort(B); if (i) for (var h = 1; h < g.length; h++) g[h] === g[h - 1] && g.splice(h--, 1) } return g }; k.matches = function(g, h) { return k(g, null, null, h) }; k.find = function(g, h, l) { + var m, q; if (!g) return []; + for (var p = 0, v = n.order.length; p < v; p++) { var t = n.order[p]; if (q = n.leftMatch[t].exec(g)) { var y = q[1]; q.splice(1, 1); if (y.substr(y.length - 1) !== "\\") { q[1] = (q[1] || "").replace(/\\/g, ""); m = n.find[t](q, h, l); if (m != null) { g = g.replace(n.match[t], ""); break } } } } m || (m = h.getElementsByTagName("*")); return { set: m, expr: g} +}; k.filter = function(g, h, l, m) { + for (var q = g, p = [], v = h, t, y, S = h && h[0] && x(h[0]); g && h.length; ) { + for (var H in n.filter) if ((t = n.leftMatch[H].exec(g)) != null && t[2]) { + var M = n.filter[H], I, D; D = t[1]; y = false; t.splice(1, 1); if (D.substr(D.length - +1) !== "\\") { if (v === p) p = []; if (n.preFilter[H]) if (t = n.preFilter[H](t, v, l, p, m, S)) { if (t === true) continue } else y = I = true; if (t) for (var U = 0; (D = v[U]) != null; U++) if (D) { I = M(D, t, U, v); var Ha = m ^ !!I; if (l && I != null) if (Ha) y = true; else v[U] = false; else if (Ha) { p.push(D); y = true } } if (I !== w) { l || (v = p); g = g.replace(n.match[H], ""); if (!y) return []; break } } + } if (g === q) if (y == null) k.error(g); else break; q = g + } return v +}; k.error = function(g) { throw "Syntax error, unrecognized expression: " + g; }; var n = k.selectors = { order: ["ID", "NAME", "TAG"], match: { ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ +}, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function(g) { return g.getAttribute("href") } }, + relative: { "+": function(g, h) { var l = typeof h === "string", m = l && !/\W/.test(h); l = l && !m; if (m) h = h.toLowerCase(); m = 0; for (var q = g.length, p; m < q; m++) if (p = g[m]) { for (; (p = p.previousSibling) && p.nodeType !== 1; ); g[m] = l || p && p.nodeName.toLowerCase() === h ? p || false : p === h } l && k.filter(h, g, true) }, ">": function(g, h) { + var l = typeof h === "string"; if (l && !/\W/.test(h)) { h = h.toLowerCase(); for (var m = 0, q = g.length; m < q; m++) { var p = g[m]; if (p) { l = p.parentNode; g[m] = l.nodeName.toLowerCase() === h ? l : false } } } else { + m = 0; for (q = g.length; m < q; m++) if (p = g[m]) g[m] = +l ? p.parentNode : p.parentNode === h; l && k.filter(h, g, true) + } + }, "": function(g, h, l) { var m = e++, q = d; if (typeof h === "string" && !/\W/.test(h)) { var p = h = h.toLowerCase(); q = b } q("parentNode", h, m, g, p, l) }, "~": function(g, h, l) { var m = e++, q = d; if (typeof h === "string" && !/\W/.test(h)) { var p = h = h.toLowerCase(); q = b } q("previousSibling", h, m, g, p, l) } + }, find: { ID: function(g, h, l) { if (typeof h.getElementById !== "undefined" && !l) return (g = h.getElementById(g[1])) ? [g] : [] }, NAME: function(g, h) { + if (typeof h.getElementsByName !== "undefined") { + var l = []; + h = h.getElementsByName(g[1]); for (var m = 0, q = h.length; m < q; m++) h[m].getAttribute("name") === g[1] && l.push(h[m]); return l.length === 0 ? null : l + } + }, TAG: function(g, h) { return h.getElementsByTagName(g[1]) } + }, preFilter: { CLASS: function(g, h, l, m, q, p) { g = " " + g[1].replace(/\\/g, "") + " "; if (p) return g; p = 0; for (var v; (v = h[p]) != null; p++) if (v) if (q ^ (v.className && (" " + v.className + " ").replace(/[\t\n]/g, " ").indexOf(g) >= 0)) l || m.push(v); else if (l) h[p] = false; return false }, ID: function(g) { return g[1].replace(/\\/g, "") }, TAG: function(g) { return g[1].toLowerCase() }, + CHILD: function(g) { if (g[1] === "nth") { var h = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2] === "even" && "2n" || g[2] === "odd" && "2n+1" || !/\D/.test(g[2]) && "0n+" + g[2] || g[2]); g[2] = h[1] + (h[2] || 1) - 0; g[3] = h[3] - 0 } g[0] = e++; return g }, ATTR: function(g, h, l, m, q, p) { h = g[1].replace(/\\/g, ""); if (!p && n.attrMap[h]) g[1] = n.attrMap[h]; if (g[2] === "~=") g[4] = " " + g[4] + " "; return g }, PSEUDO: function(g, h, l, m, q) { + if (g[1] === "not") if ((f.exec(g[3]) || "").length > 1 || /^\w/.test(g[3])) g[3] = k(g[3], null, null, h); else { + g = k.filter(g[3], h, l, true ^ q); l || m.push.apply(m, +g); return false + } else if (n.match.POS.test(g[0]) || n.match.CHILD.test(g[0])) return true; return g + }, POS: function(g) { g.unshift(true); return g } + }, filters: { enabled: function(g) { return g.disabled === false && g.type !== "hidden" }, disabled: function(g) { return g.disabled === true }, checked: function(g) { return g.checked === true }, selected: function(g) { return g.selected === true }, parent: function(g) { return !!g.firstChild }, empty: function(g) { return !g.firstChild }, has: function(g, h, l) { return !!k(l[3], g).length }, header: function(g) { return /h\d/i.test(g.nodeName) }, + text: function(g) { return "text" === g.type }, radio: function(g) { return "radio" === g.type }, checkbox: function(g) { return "checkbox" === g.type }, file: function(g) { return "file" === g.type }, password: function(g) { return "password" === g.type }, submit: function(g) { return "submit" === g.type }, image: function(g) { return "image" === g.type }, reset: function(g) { return "reset" === g.type }, button: function(g) { return "button" === g.type || g.nodeName.toLowerCase() === "button" }, input: function(g) { return /input|select|textarea|button/i.test(g.nodeName) } + }, + setFilters: { first: function(g, h) { return h === 0 }, last: function(g, h, l, m) { return h === m.length - 1 }, even: function(g, h) { return h % 2 === 0 }, odd: function(g, h) { return h % 2 === 1 }, lt: function(g, h, l) { return h < l[3] - 0 }, gt: function(g, h, l) { return h > l[3] - 0 }, nth: function(g, h, l) { return l[3] - 0 === h }, eq: function(g, h, l) { return l[3] - 0 === h } }, filter: { PSEUDO: function(g, h, l, m) { + var q = h[1], p = n.filters[q]; if (p) return p(g, l, h, m); else if (q === "contains") return (g.textContent || g.innerText || a([g]) || "").indexOf(h[3]) >= 0; else if (q === "not") { + h = +h[3]; l = 0; for (m = h.length; l < m; l++) if (h[l] === g) return false; return true + } else k.error("Syntax error, unrecognized expression: " + q) + }, CHILD: function(g, h) { + var l = h[1], m = g; switch (l) { + case "only": case "first": for (; m = m.previousSibling; ) if (m.nodeType === 1) return false; if (l === "first") return true; m = g; case "last": for (; m = m.nextSibling; ) if (m.nodeType === 1) return false; return true; case "nth": l = h[2]; var q = h[3]; if (l === 1 && q === 0) return true; h = h[0]; var p = g.parentNode; if (p && (p.sizcache !== h || !g.nodeIndex)) { + var v = 0; for (m = p.firstChild; m; m = +m.nextSibling) if (m.nodeType === 1) m.nodeIndex = ++v; p.sizcache = h + } g = g.nodeIndex - q; return l === 0 ? g === 0 : g % l === 0 && g / l >= 0 + } + }, ID: function(g, h) { return g.nodeType === 1 && g.getAttribute("id") === h }, TAG: function(g, h) { return h === "*" && g.nodeType === 1 || g.nodeName.toLowerCase() === h }, CLASS: function(g, h) { return (" " + (g.className || g.getAttribute("class")) + " ").indexOf(h) > -1 }, ATTR: function(g, h) { + var l = h[1]; g = n.attrHandle[l] ? n.attrHandle[l](g) : g[l] != null ? g[l] : g.getAttribute(l); l = g + ""; var m = h[2]; h = h[4]; return g == null ? m === "!=" : m === +"=" ? l === h : m === "*=" ? l.indexOf(h) >= 0 : m === "~=" ? (" " + l + " ").indexOf(h) >= 0 : !h ? l && g !== false : m === "!=" ? l !== h : m === "^=" ? l.indexOf(h) === 0 : m === "$=" ? l.substr(l.length - h.length) === h : m === "|=" ? l === h || l.substr(0, h.length + 1) === h + "-" : false + }, POS: function(g, h, l, m) { var q = n.setFilters[h[2]]; if (q) return q(g, l, h, m) } } + }, r = n.match.POS; for (var u in n.match) { + n.match[u] = new RegExp(n.match[u].source + /(?![^\[]*\])(?![^\(]*\))/.source); n.leftMatch[u] = new RegExp(/(^(?:.|\r|\n)*?)/.source + n.match[u].source.replace(/\\(\d+)/g, function(g, +h) { return "\\" + (h - 0 + 1) })) + } var z = function(g, h) { g = Array.prototype.slice.call(g, 0); if (h) { h.push.apply(h, g); return h } return g }; try { Array.prototype.slice.call(s.documentElement.childNodes, 0) } catch (C) { z = function(g, h) { h = h || []; if (j.call(g) === "[object Array]") Array.prototype.push.apply(h, g); else if (typeof g.length === "number") for (var l = 0, m = g.length; l < m; l++) h.push(g[l]); else for (l = 0; g[l]; l++) h.push(g[l]); return h } } var B; if (s.documentElement.compareDocumentPosition) B = function(g, h) { + if (!g.compareDocumentPosition || +!h.compareDocumentPosition) { if (g == h) i = true; return g.compareDocumentPosition ? -1 : 1 } g = g.compareDocumentPosition(h) & 4 ? -1 : g === h ? 0 : 1; if (g === 0) i = true; return g + }; else if ("sourceIndex" in s.documentElement) B = function(g, h) { if (!g.sourceIndex || !h.sourceIndex) { if (g == h) i = true; return g.sourceIndex ? -1 : 1 } g = g.sourceIndex - h.sourceIndex; if (g === 0) i = true; return g }; else if (s.createRange) B = function(g, h) { + if (!g.ownerDocument || !h.ownerDocument) { if (g == h) i = true; return g.ownerDocument ? -1 : 1 } var l = g.ownerDocument.createRange(), m = +h.ownerDocument.createRange(); l.setStart(g, 0); l.setEnd(g, 0); m.setStart(h, 0); m.setEnd(h, 0); g = l.compareBoundaryPoints(Range.START_TO_END, m); if (g === 0) i = true; return g + }; (function() { + var g = s.createElement("div"), h = "script" + (new Date).getTime(); g.innerHTML = ""; var l = s.documentElement; l.insertBefore(g, l.firstChild); if (s.getElementById(h)) { + n.find.ID = function(m, q, p) { + if (typeof q.getElementById !== "undefined" && !p) return (q = q.getElementById(m[1])) ? q.id === m[1] || typeof q.getAttributeNode !== "undefined" && +q.getAttributeNode("id").nodeValue === m[1] ? [q] : w : [] + }; n.filter.ID = function(m, q) { var p = typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id"); return m.nodeType === 1 && p && p.nodeValue === q } + } l.removeChild(g); l = g = null + })(); (function() { + var g = s.createElement("div"); g.appendChild(s.createComment("")); if (g.getElementsByTagName("*").length > 0) n.find.TAG = function(h, l) { l = l.getElementsByTagName(h[1]); if (h[1] === "*") { h = []; for (var m = 0; l[m]; m++) l[m].nodeType === 1 && h.push(l[m]); l = h } return l }; g.innerHTML = ""; + if (g.firstChild && typeof g.firstChild.getAttribute !== "undefined" && g.firstChild.getAttribute("href") !== "#") n.attrHandle.href = function(h) { return h.getAttribute("href", 2) }; g = null + })(); s.querySelectorAll && function() { var g = k, h = s.createElement("div"); h.innerHTML = "

    "; if (!(h.querySelectorAll && h.querySelectorAll(".TEST").length === 0)) { k = function(m, q, p, v) { q = q || s; if (!v && q.nodeType === 9 && !x(q)) try { return z(q.querySelectorAll(m), p) } catch (t) { } return g(m, q, p, v) }; for (var l in g) k[l] = g[l]; h = null } } (); + (function() { var g = s.createElement("div"); g.innerHTML = "
    "; if (!(!g.getElementsByClassName || g.getElementsByClassName("e").length === 0)) { g.lastChild.className = "e"; if (g.getElementsByClassName("e").length !== 1) { n.order.splice(1, 0, "CLASS"); n.find.CLASS = function(h, l, m) { if (typeof l.getElementsByClassName !== "undefined" && !m) return l.getElementsByClassName(h[1]) }; g = null } } })(); var E = s.compareDocumentPosition ? function(g, h) { return !!(g.compareDocumentPosition(h) & 16) } : +function(g, h) { return g !== h && (g.contains ? g.contains(h) : true) }, x = function(g) { return (g = (g ? g.ownerDocument || g : 0).documentElement) ? g.nodeName !== "HTML" : false }, ga = function(g, h) { var l = [], m = "", q; for (h = h.nodeType ? [h] : h; q = n.match.PSEUDO.exec(g); ) { m += q[0]; g = g.replace(n.match.PSEUDO, "") } g = n.relative[g] ? g + "*" : g; q = 0; for (var p = h.length; q < p; q++) k(g, h[q], l); return k.filter(m, l) }; c.find = k; c.expr = k.selectors; c.expr[":"] = c.expr.filters; c.unique = k.uniqueSort; c.text = a; c.isXMLDoc = x; c.contains = E +})(); var eb = /Until$/, fb = /^(?:parents|prevUntil|prevAll)/, +gb = /,/; R = Array.prototype.slice; var Ia = function(a, b, d) { if (c.isFunction(b)) return c.grep(a, function(e, j) { return !!b.call(e, j, e) === d }); else if (b.nodeType) return c.grep(a, function(e) { return e === b === d }); else if (typeof b === "string") { var f = c.grep(a, function(e) { return e.nodeType === 1 }); if (Ua.test(b)) return c.filter(b, f, !d); else b = c.filter(b, f) } return c.grep(a, function(e) { return c.inArray(e, b) >= 0 === d }) }; c.fn.extend({ find: function(a) { + for (var b = this.pushStack("", "find", a), d = 0, f = 0, e = this.length; f < e; f++) { + d = b.length; + c.find(a, this[f], b); if (f > 0) for (var j = d; j < b.length; j++) for (var i = 0; i < d; i++) if (b[i] === b[j]) { b.splice(j--, 1); break } + } return b +}, has: function(a) { var b = c(a); return this.filter(function() { for (var d = 0, f = b.length; d < f; d++) if (c.contains(this, b[d])) return true }) }, not: function(a) { return this.pushStack(Ia(this, a, false), "not", a) }, filter: function(a) { return this.pushStack(Ia(this, a, true), "filter", a) }, is: function(a) { return !!a && c.filter(a, this).length > 0 }, closest: function(a, b) { + if (c.isArray(a)) { + var d = [], f = this[0], e, j = +{}, i; if (f && a.length) { e = 0; for (var o = a.length; e < o; e++) { i = a[e]; j[i] || (j[i] = c.expr.match.POS.test(i) ? c(i, b || this.context) : i) } for (; f && f.ownerDocument && f !== b; ) { for (i in j) { e = j[i]; if (e.jquery ? e.index(f) > -1 : c(f).is(e)) { d.push({ selector: i, elem: f }); delete j[i] } } f = f.parentNode } } return d + } var k = c.expr.match.POS.test(a) ? c(a, b || this.context) : null; return this.map(function(n, r) { for (; r && r.ownerDocument && r !== b; ) { if (k ? k.index(r) > -1 : c(r).is(a)) return r; r = r.parentNode } return null }) +}, index: function(a) { + if (!a || typeof a === +"string") return c.inArray(this[0], a ? c(a) : this.parent().children()); return c.inArray(a.jquery ? a[0] : a, this) +}, add: function(a, b) { a = typeof a === "string" ? c(a, b || this.context) : c.makeArray(a); b = c.merge(this.get(), a); return this.pushStack(qa(a[0]) || qa(b[0]) ? b : c.unique(b)) }, andSelf: function() { return this.add(this.prevObject) } +}); c.each({ parent: function(a) { return (a = a.parentNode) && a.nodeType !== 11 ? a : null }, parents: function(a) { return c.dir(a, "parentNode") }, parentsUntil: function(a, b, d) { + return c.dir(a, "parentNode", +d) +}, next: function(a) { return c.nth(a, 2, "nextSibling") }, prev: function(a) { return c.nth(a, 2, "previousSibling") }, nextAll: function(a) { return c.dir(a, "nextSibling") }, prevAll: function(a) { return c.dir(a, "previousSibling") }, nextUntil: function(a, b, d) { return c.dir(a, "nextSibling", d) }, prevUntil: function(a, b, d) { return c.dir(a, "previousSibling", d) }, siblings: function(a) { return c.sibling(a.parentNode.firstChild, a) }, children: function(a) { return c.sibling(a.firstChild) }, contents: function(a) { + return c.nodeName(a, "iframe") ? +a.contentDocument || a.contentWindow.document : c.makeArray(a.childNodes) +} +}, function(a, b) { c.fn[a] = function(d, f) { var e = c.map(this, b, d); eb.test(a) || (f = d); if (f && typeof f === "string") e = c.filter(f, e); e = this.length > 1 ? c.unique(e) : e; if ((this.length > 1 || gb.test(f)) && fb.test(a)) e = e.reverse(); return this.pushStack(e, a, R.call(arguments).join(",")) } }); c.extend({ filter: function(a, b, d) { if (d) a = ":not(" + a + ")"; return c.find.matches(a, b) }, dir: function(a, b, d) { + var f = []; for (a = a[b]; a && a.nodeType !== 9 && (d === w || a.nodeType !== 1 || !c(a).is(d)); ) { + a.nodeType === +1 && f.push(a); a = a[b] + } return f +}, nth: function(a, b, d) { b = b || 1; for (var f = 0; a; a = a[d]) if (a.nodeType === 1 && ++f === b) break; return a }, sibling: function(a, b) { for (var d = []; a; a = a.nextSibling) a.nodeType === 1 && a !== b && d.push(a); return d } +}); var Ja = / jQuery\d+="(?:\d+|null)"/g, V = /^\s+/, Ka = /(<([\w:]+)[^>]*?)\/>/g, hb = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, La = /<([\w:]+)/, ib = /" +}, F = { option: [1, ""], legend: [1, "
    ", "
    "], thead: [1, "", "
    "], tr: [2, "", "
    "], td: [3, "", "
    "], col: [2, "", "
    "], area: [1, "", ""], _default: [0, "", ""] }; F.optgroup = F.option; F.tbody = F.tfoot = F.colgroup = F.caption = F.thead; F.th = F.td; if (!c.support.htmlSerialize) F._default = [1, "div
    ", "
    "]; c.fn.extend({ text: function(a) { + if (c.isFunction(a)) return this.each(function(b) { + var d = +c(this); d.text(a.call(this, b, d.text())) + }); if (typeof a !== "object" && a !== w) return this.empty().append((this[0] && this[0].ownerDocument || s).createTextNode(a)); return c.text(this) +}, wrapAll: function(a) { if (c.isFunction(a)) return this.each(function(d) { c(this).wrapAll(a.call(this, d)) }); if (this[0]) { var b = c(a, this[0].ownerDocument).eq(0).clone(true); this[0].parentNode && b.insertBefore(this[0]); b.map(function() { for (var d = this; d.firstChild && d.firstChild.nodeType === 1; ) d = d.firstChild; return d }).append(this) } return this }, + wrapInner: function(a) { if (c.isFunction(a)) return this.each(function(b) { c(this).wrapInner(a.call(this, b)) }); return this.each(function() { var b = c(this), d = b.contents(); d.length ? d.wrapAll(a) : b.append(a) }) }, wrap: function(a) { return this.each(function() { c(this).wrapAll(a) }) }, unwrap: function() { return this.parent().each(function() { c.nodeName(this, "body") || c(this).replaceWith(this.childNodes) }).end() }, append: function() { return this.domManip(arguments, true, function(a) { this.nodeType === 1 && this.appendChild(a) }) }, + prepend: function() { return this.domManip(arguments, true, function(a) { this.nodeType === 1 && this.insertBefore(a, this.firstChild) }) }, before: function() { if (this[0] && this[0].parentNode) return this.domManip(arguments, false, function(b) { this.parentNode.insertBefore(b, this) }); else if (arguments.length) { var a = c(arguments[0]); a.push.apply(a, this.toArray()); return this.pushStack(a, "before", arguments) } }, after: function() { + if (this[0] && this[0].parentNode) return this.domManip(arguments, false, function(b) { + this.parentNode.insertBefore(b, +this.nextSibling) + }); else if (arguments.length) { var a = this.pushStack(this, "after", arguments); a.push.apply(a, c(arguments[0]).toArray()); return a } + }, remove: function(a, b) { for (var d = 0, f; (f = this[d]) != null; d++) if (!a || c.filter(a, [f]).length) { if (!b && f.nodeType === 1) { c.cleanData(f.getElementsByTagName("*")); c.cleanData([f]) } f.parentNode && f.parentNode.removeChild(f) } return this }, empty: function() { + for (var a = 0, b; (b = this[a]) != null; a++) for (b.nodeType === 1 && c.cleanData(b.getElementsByTagName("*")); b.firstChild; ) b.removeChild(b.firstChild); + return this + }, clone: function(a) { var b = this.map(function() { if (!c.support.noCloneEvent && !c.isXMLDoc(this)) { var d = this.outerHTML, f = this.ownerDocument; if (!d) { d = f.createElement("div"); d.appendChild(this.cloneNode(true)); d = d.innerHTML } return c.clean([d.replace(Ja, "").replace(/=([^="'>\s]+\/)>/g, '="$1">').replace(V, "")], f)[0] } else return this.cloneNode(true) }); if (a === true) { ra(this, b); ra(this.find("*"), b.find("*")) } return b }, html: function(a) { + if (a === w) return this[0] && this[0].nodeType === 1 ? this[0].innerHTML.replace(Ja, +"") : null; else if (typeof a === "string" && !ta.test(a) && (c.support.leadingWhitespace || !V.test(a)) && !F[(La.exec(a) || ["", ""])[1].toLowerCase()]) { a = a.replace(Ka, Ma); try { for (var b = 0, d = this.length; b < d; b++) if (this[b].nodeType === 1) { c.cleanData(this[b].getElementsByTagName("*")); this[b].innerHTML = a } } catch (f) { this.empty().append(a) } } else c.isFunction(a) ? this.each(function(e) { var j = c(this), i = j.html(); j.empty().append(function() { return a.call(this, e, i) }) }) : this.empty().append(a); return this + }, replaceWith: function(a) { + if (this[0] && +this[0].parentNode) { if (c.isFunction(a)) return this.each(function(b) { var d = c(this), f = d.html(); d.replaceWith(a.call(this, b, f)) }); if (typeof a !== "string") a = c(a).detach(); return this.each(function() { var b = this.nextSibling, d = this.parentNode; c(this).remove(); b ? c(b).before(a) : c(d).append(a) }) } else return this.pushStack(c(c.isFunction(a) ? a() : a), "replaceWith", a) + }, detach: function(a) { return this.remove(a, true) }, domManip: function(a, b, d) { + function f(u) { + return c.nodeName(u, "table") ? u.getElementsByTagName("tbody")[0] || +u.appendChild(u.ownerDocument.createElement("tbody")) : u + } var e, j, i = a[0], o = [], k; if (!c.support.checkClone && arguments.length === 3 && typeof i === "string" && ua.test(i)) return this.each(function() { c(this).domManip(a, b, d, true) }); if (c.isFunction(i)) return this.each(function(u) { var z = c(this); a[0] = i.call(this, u, b ? z.html() : w); z.domManip(a, b, d) }); if (this[0]) { + e = i && i.parentNode; e = c.support.parentNode && e && e.nodeType === 11 && e.childNodes.length === this.length ? { fragment: e} : sa(a, this, o); k = e.fragment; if (j = k.childNodes.length === +1 ? (k = k.firstChild) : k.firstChild) { b = b && c.nodeName(j, "tr"); for (var n = 0, r = this.length; n < r; n++) d.call(b ? f(this[n], j) : this[n], n > 0 || e.cacheable || this.length > 1 ? k.cloneNode(true) : k) } o.length && c.each(o, Qa) + } return this + } +}); c.fragments = {}; c.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function(a, b) { + c.fn[a] = function(d) { + var f = []; d = c(d); var e = this.length === 1 && this[0].parentNode; if (e && e.nodeType === 11 && e.childNodes.length === 1 && d.length === 1) { + d[b](this[0]); + return this + } else { e = 0; for (var j = d.length; e < j; e++) { var i = (e > 0 ? this.clone(true) : this).get(); c.fn[b].apply(c(d[e]), i); f = f.concat(i) } return this.pushStack(f, a, d.selector) } + } +}); c.extend({ clean: function(a, b, d, f) { + b = b || s; if (typeof b.createElement === "undefined") b = b.ownerDocument || b[0] && b[0].ownerDocument || s; for (var e = [], j = 0, i; (i = a[j]) != null; j++) { + if (typeof i === "number") i += ""; if (i) { + if (typeof i === "string" && !jb.test(i)) i = b.createTextNode(i); else if (typeof i === "string") { + i = i.replace(Ka, Ma); var o = (La.exec(i) || ["", +""])[1].toLowerCase(), k = F[o] || F._default, n = k[0], r = b.createElement("div"); for (r.innerHTML = k[1] + i + k[2]; n--; ) r = r.lastChild; if (!c.support.tbody) { n = ib.test(i); o = o === "table" && !n ? r.firstChild && r.firstChild.childNodes : k[1] === "" && !n ? r.childNodes : []; for (k = o.length - 1; k >= 0; --k) c.nodeName(o[k], "tbody") && !o[k].childNodes.length && o[k].parentNode.removeChild(o[k]) } !c.support.leadingWhitespace && V.test(i) && r.insertBefore(b.createTextNode(V.exec(i)[0]), r.firstChild); i = r.childNodes + } if (i.nodeType) e.push(i); else e = +c.merge(e, i) + } + } if (d) for (j = 0; e[j]; j++) if (f && c.nodeName(e[j], "script") && (!e[j].type || e[j].type.toLowerCase() === "text/javascript")) f.push(e[j].parentNode ? e[j].parentNode.removeChild(e[j]) : e[j]); else { e[j].nodeType === 1 && e.splice.apply(e, [j + 1, 0].concat(c.makeArray(e[j].getElementsByTagName("script")))); d.appendChild(e[j]) } return e +}, cleanData: function(a) { + for (var b, d, f = c.cache, e = c.event.special, j = c.support.deleteExpando, i = 0, o; (o = a[i]) != null; i++) if (d = o[c.expando]) { + b = f[d]; if (b.events) for (var k in b.events) e[k] ? +c.event.remove(o, k) : Ca(o, k, b.handle); if (j) delete o[c.expando]; else o.removeAttribute && o.removeAttribute(c.expando); delete f[d] + } +} +}); var kb = /z-?index|font-?weight|opacity|zoom|line-?height/i, Na = /alpha\([^)]*\)/, Oa = /opacity=([^)]*)/, ha = /float/i, ia = /-([a-z])/ig, lb = /([A-Z])/g, mb = /^-?\d+(?:px)?$/i, nb = /^-?\d/, ob = { position: "absolute", visibility: "hidden", display: "block" }, pb = ["Left", "Right"], qb = ["Top", "Bottom"], rb = s.defaultView && s.defaultView.getComputedStyle, Pa = c.support.cssFloat ? "cssFloat" : "styleFloat", ja = +function(a, b) { return b.toUpperCase() }; c.fn.css = function(a, b) { return X(this, a, b, true, function(d, f, e) { if (e === w) return c.curCSS(d, f); if (typeof e === "number" && !kb.test(f)) e += "px"; c.style(d, f, e) }) }; c.extend({ style: function(a, b, d) { + if (!a || a.nodeType === 3 || a.nodeType === 8) return w; if ((b === "width" || b === "height") && parseFloat(d) < 0) d = w; var f = a.style || a, e = d !== w; if (!c.support.opacity && b === "opacity") { + if (e) { + f.zoom = 1; b = parseInt(d, 10) + "" === "NaN" ? "" : "alpha(opacity=" + d * 100 + ")"; a = f.filter || c.curCSS(a, "filter") || ""; f.filter = +Na.test(a) ? a.replace(Na, b) : b + } return f.filter && f.filter.indexOf("opacity=") >= 0 ? parseFloat(Oa.exec(f.filter)[1]) / 100 + "" : "" + } if (ha.test(b)) b = Pa; b = b.replace(ia, ja); if (e) f[b] = d; return f[b] +}, css: function(a, b, d, f) { + if (b === "width" || b === "height") { + var e, j = b === "width" ? pb : qb; function i() { + e = b === "width" ? a.offsetWidth : a.offsetHeight; f !== "border" && c.each(j, function() { + f || (e -= parseFloat(c.curCSS(a, "padding" + this, true)) || 0); if (f === "margin") e += parseFloat(c.curCSS(a, "margin" + this, true)) || 0; else e -= parseFloat(c.curCSS(a, +"border" + this + "Width", true)) || 0 + }) + } a.offsetWidth !== 0 ? i() : c.swap(a, ob, i); return Math.max(0, Math.round(e)) + } return c.curCSS(a, b, d) +}, curCSS: function(a, b, d) { + var f, e = a.style; if (!c.support.opacity && b === "opacity" && a.currentStyle) { f = Oa.test(a.currentStyle.filter || "") ? parseFloat(RegExp.$1) / 100 + "" : ""; return f === "" ? "1" : f } if (ha.test(b)) b = Pa; if (!d && e && e[b]) f = e[b]; else if (rb) { + if (ha.test(b)) b = "float"; b = b.replace(lb, "-$1").toLowerCase(); e = a.ownerDocument.defaultView; if (!e) return null; if (a = e.getComputedStyle(a, null)) f = +a.getPropertyValue(b); if (b === "opacity" && f === "") f = "1" + } else if (a.currentStyle) { d = b.replace(ia, ja); f = a.currentStyle[b] || a.currentStyle[d]; if (!mb.test(f) && nb.test(f)) { b = e.left; var j = a.runtimeStyle.left; a.runtimeStyle.left = a.currentStyle.left; e.left = d === "fontSize" ? "1em" : f || 0; f = e.pixelLeft + "px"; e.left = b; a.runtimeStyle.left = j } } return f +}, swap: function(a, b, d) { var f = {}; for (var e in b) { f[e] = a.style[e]; a.style[e] = b[e] } d.call(a); for (e in b) a.style[e] = f[e] } +}); if (c.expr && c.expr.filters) { + c.expr.filters.hidden = function(a) { + var b = +a.offsetWidth, d = a.offsetHeight, f = a.nodeName.toLowerCase() === "tr"; return b === 0 && d === 0 && !f ? true : b > 0 && d > 0 && !f ? false : c.curCSS(a, "display") === "none" + }; c.expr.filters.visible = function(a) { return !c.expr.filters.hidden(a) } + } var sb = J(), tb = //gi, ub = /select|textarea/i, vb = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i, N = /=\?(&|$)/, ka = /\?/, wb = /(\?|&)_=.*?(&|$)/, xb = /^(\w+:)?\/\/([^\/?#]+)/, yb = /%20/g, zb = c.fn.load; c.fn.extend({ load: function(a, b, d) { + if (typeof a !== +"string") return zb.call(this, a); else if (!this.length) return this; var f = a.indexOf(" "); if (f >= 0) { var e = a.slice(f, a.length); a = a.slice(0, f) } f = "GET"; if (b) if (c.isFunction(b)) { d = b; b = null } else if (typeof b === "object") { b = c.param(b, c.ajaxSettings.traditional); f = "POST" } var j = this; c.ajax({ url: a, type: f, dataType: "html", data: b, complete: function(i, o) { if (o === "success" || o === "notmodified") j.html(e ? c("
    ").append(i.responseText.replace(tb, "")).find(e) : i.responseText); d && j.each(d, [i.responseText, o, i]) } }); return this + }, + serialize: function() { return c.param(this.serializeArray()) }, serializeArray: function() { return this.map(function() { return this.elements ? c.makeArray(this.elements) : this }).filter(function() { return this.name && !this.disabled && (this.checked || ub.test(this.nodeName) || vb.test(this.type)) }).map(function(a, b) { a = c(this).val(); return a == null ? null : c.isArray(a) ? c.map(a, function(d) { return { name: b.name, value: d} }) : { name: b.name, value: a} }).get() } + }); c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a, b) { c.fn[b] = function(d) { return this.bind(b, d) } }); c.extend({ get: function(a, b, d, f) { if (c.isFunction(b)) { f = f || d; d = b; b = null } return c.ajax({ type: "GET", url: a, data: b, success: d, dataType: f }) }, getScript: function(a, b) { return c.get(a, null, b, "script") }, getJSON: function(a, b, d) { return c.get(a, b, d, "json") }, post: function(a, b, d, f) { if (c.isFunction(b)) { f = f || d; d = b; b = {} } return c.ajax({ type: "POST", url: a, data: b, success: d, dataType: f }) }, ajaxSetup: function(a) { c.extend(c.ajaxSettings, a) }, ajaxSettings: { url: location.href, + global: true, type: "GET", contentType: "application/x-www-form-urlencoded", processData: true, async: true, xhr: A.XMLHttpRequest && (A.location.protocol !== "file:" || !A.ActiveXObject) ? function() { return new A.XMLHttpRequest } : function() { try { return new A.ActiveXObject("Microsoft.XMLHTTP") } catch (a) { } }, accepts: { xml: "application/xml, text/xml", html: "text/html", script: "text/javascript, application/javascript", json: "application/json, text/javascript", text: "text/plain", _default: "*/*"} +}, lastModified: {}, etag: {}, ajax: function(a) { + function b() { + e.success && +e.success.call(k, o, i, x); e.global && f("ajaxSuccess", [x, e]) + } function d() { e.complete && e.complete.call(k, x, i); e.global && f("ajaxComplete", [x, e]); e.global && ! --c.active && c.event.trigger("ajaxStop") } function f(q, p) { (e.context ? c(e.context) : c.event).trigger(q, p) } var e = c.extend(true, {}, c.ajaxSettings, a), j, i, o, k = a && a.context || e, n = e.type.toUpperCase(); if (e.data && e.processData && typeof e.data !== "string") e.data = c.param(e.data, e.traditional); if (e.dataType === "jsonp") { + if (n === "GET") N.test(e.url) || (e.url += (ka.test(e.url) ? +"&" : "?") + (e.jsonp || "callback") + "=?"); else if (!e.data || !N.test(e.data)) e.data = (e.data ? e.data + "&" : "") + (e.jsonp || "callback") + "=?"; e.dataType = "json" + } if (e.dataType === "json" && (e.data && N.test(e.data) || N.test(e.url))) { j = e.jsonpCallback || "jsonp" + sb++; if (e.data) e.data = (e.data + "").replace(N, "=" + j + "$1"); e.url = e.url.replace(N, "=" + j + "$1"); e.dataType = "script"; A[j] = A[j] || function(q) { o = q; b(); d(); A[j] = w; try { delete A[j] } catch (p) { } z && z.removeChild(C) } } if (e.dataType === "script" && e.cache === null) e.cache = false; if (e.cache === +false && n === "GET") { var r = J(), u = e.url.replace(wb, "$1_=" + r + "$2"); e.url = u + (u === e.url ? (ka.test(e.url) ? "&" : "?") + "_=" + r : "") } if (e.data && n === "GET") e.url += (ka.test(e.url) ? "&" : "?") + e.data; e.global && !c.active++ && c.event.trigger("ajaxStart"); r = (r = xb.exec(e.url)) && (r[1] && r[1] !== location.protocol || r[2] !== location.host); if (e.dataType === "script" && n === "GET" && r) { + var z = s.getElementsByTagName("head")[0] || s.documentElement, C = s.createElement("script"); C.src = e.url; if (e.scriptCharset) C.charset = e.scriptCharset; if (!j) { + var B = +false; C.onload = C.onreadystatechange = function() { if (!B && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) { B = true; b(); d(); C.onload = C.onreadystatechange = null; z && C.parentNode && z.removeChild(C) } } + } z.insertBefore(C, z.firstChild); return w + } var E = false, x = e.xhr(); if (x) { + e.username ? x.open(n, e.url, e.async, e.username, e.password) : x.open(n, e.url, e.async); try { + if (e.data || a && a.contentType) x.setRequestHeader("Content-Type", e.contentType); if (e.ifModified) { + c.lastModified[e.url] && x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]); c.etag[e.url] && x.setRequestHeader("If-None-Match", c.etag[e.url]) + } r || x.setRequestHeader("X-Requested-With", "XMLHttpRequest"); x.setRequestHeader("Accept", e.dataType && e.accepts[e.dataType] ? e.accepts[e.dataType] + ", */*" : e.accepts._default) + } catch (ga) { } if (e.beforeSend && e.beforeSend.call(k, x, e) === false) { e.global && ! --c.active && c.event.trigger("ajaxStop"); x.abort(); return false } e.global && f("ajaxSend", [x, e]); var g = x.onreadystatechange = function(q) { + if (!x || x.readyState === 0 || q === "abort") { + E || +d(); E = true; if (x) x.onreadystatechange = c.noop + } else if (!E && x && (x.readyState === 4 || q === "timeout")) { E = true; x.onreadystatechange = c.noop; i = q === "timeout" ? "timeout" : !c.httpSuccess(x) ? "error" : e.ifModified && c.httpNotModified(x, e.url) ? "notmodified" : "success"; var p; if (i === "success") try { o = c.httpData(x, e.dataType, e) } catch (v) { i = "parsererror"; p = v } if (i === "success" || i === "notmodified") j || b(); else c.handleError(e, x, i, p); d(); q === "timeout" && x.abort(); if (e.async) x = null } + }; try { + var h = x.abort; x.abort = function() { + x && h.call(x); + g("abort") + } + } catch (l) { } e.async && e.timeout > 0 && setTimeout(function() { x && !E && g("timeout") }, e.timeout); try { x.send(n === "POST" || n === "PUT" || n === "DELETE" ? e.data : null) } catch (m) { c.handleError(e, x, null, m); d() } e.async || g(); return x + } +}, handleError: function(a, b, d, f) { if (a.error) a.error.call(a.context || a, b, d, f); if (a.global) (a.context ? c(a.context) : c.event).trigger("ajaxError", [b, a, f]) }, active: 0, httpSuccess: function(a) { + try { + return !a.status && location.protocol === "file:" || a.status >= 200 && a.status < 300 || a.status === 304 || a.status === +1223 || a.status === 0 + } catch (b) { } return false +}, httpNotModified: function(a, b) { var d = a.getResponseHeader("Last-Modified"), f = a.getResponseHeader("Etag"); if (d) c.lastModified[b] = d; if (f) c.etag[b] = f; return a.status === 304 || a.status === 0 }, httpData: function(a, b, d) { + var f = a.getResponseHeader("content-type") || "", e = b === "xml" || !b && f.indexOf("xml") >= 0; a = e ? a.responseXML : a.responseText; e && a.documentElement.nodeName === "parsererror" && c.error("parsererror"); if (d && d.dataFilter) a = d.dataFilter(a, b); if (typeof a === "string") if (b === +"json" || !b && f.indexOf("json") >= 0) a = c.parseJSON(a); else if (b === "script" || !b && f.indexOf("javascript") >= 0) c.globalEval(a); return a +}, param: function(a, b) { + function d(i, o) { if (c.isArray(o)) c.each(o, function(k, n) { b || /\[\]$/.test(i) ? f(i, n) : d(i + "[" + (typeof n === "object" || c.isArray(n) ? k : "") + "]", n) }); else !b && o != null && typeof o === "object" ? c.each(o, function(k, n) { d(i + "[" + k + "]", n) }) : f(i, o) } function f(i, o) { o = c.isFunction(o) ? o() : o; e[e.length] = encodeURIComponent(i) + "=" + encodeURIComponent(o) } var e = []; if (b === w) b = c.ajaxSettings.traditional; + if (c.isArray(a) || a.jquery) c.each(a, function() { f(this.name, this.value) }); else for (var j in a) d(j, a[j]); return e.join("&").replace(yb, "+") +} +}); var la = {}, Ab = /toggle|show|hide/, Bb = /^([+-]=)?([\d+-.]+)(.*)$/, W, va = [["height", "marginTop", "marginBottom", "paddingTop", "paddingBottom"], ["width", "marginLeft", "marginRight", "paddingLeft", "paddingRight"], ["opacity"]]; c.fn.extend({ show: function(a, b) { + if (a || a === 0) return this.animate(K("show", 3), a, b); else { + a = 0; for (b = this.length; a < b; a++) { + var d = c.data(this[a], "olddisplay"); + this[a].style.display = d || ""; if (c.css(this[a], "display") === "none") { d = this[a].nodeName; var f; if (la[d]) f = la[d]; else { var e = c("<" + d + " />").appendTo("body"); f = e.css("display"); if (f === "none") f = "block"; e.remove(); la[d] = f } c.data(this[a], "olddisplay", f) } + } a = 0; for (b = this.length; a < b; a++) this[a].style.display = c.data(this[a], "olddisplay") || ""; return this + } +}, hide: function(a, b) { + if (a || a === 0) return this.animate(K("hide", 3), a, b); else { + a = 0; for (b = this.length; a < b; a++) { + var d = c.data(this[a], "olddisplay"); !d && d !== "none" && c.data(this[a], +"olddisplay", c.css(this[a], "display")) + } a = 0; for (b = this.length; a < b; a++) this[a].style.display = "none"; return this + } +}, _toggle: c.fn.toggle, toggle: function(a, b) { var d = typeof a === "boolean"; if (c.isFunction(a) && c.isFunction(b)) this._toggle.apply(this, arguments); else a == null || d ? this.each(function() { var f = d ? a : c(this).is(":hidden"); c(this)[f ? "show" : "hide"]() }) : this.animate(K("toggle", 3), a, b); return this }, fadeTo: function(a, b, d) { return this.filter(":hidden").css("opacity", 0).show().end().animate({ opacity: b }, a, d) }, + animate: function(a, b, d, f) { + var e = c.speed(b, d, f); if (c.isEmptyObject(a)) return this.each(e.complete); return this[e.queue === false ? "each" : "queue"](function() { + var j = c.extend({}, e), i, o = this.nodeType === 1 && c(this).is(":hidden"), k = this; for (i in a) { + var n = i.replace(ia, ja); if (i !== n) { a[n] = a[i]; delete a[i]; i = n } if (a[i] === "hide" && o || a[i] === "show" && !o) return j.complete.call(this); if ((i === "height" || i === "width") && this.style) { j.display = c.css(this, "display"); j.overflow = this.style.overflow } if (c.isArray(a[i])) { + (j.specialEasing = +j.specialEasing || {})[i] = a[i][1]; a[i] = a[i][0] + } + } if (j.overflow != null) this.style.overflow = "hidden"; j.curAnim = c.extend({}, a); c.each(a, function(r, u) { var z = new c.fx(k, j, r); if (Ab.test(u)) z[u === "toggle" ? o ? "show" : "hide" : u](a); else { var C = Bb.exec(u), B = z.cur(true) || 0; if (C) { u = parseFloat(C[2]); var E = C[3] || "px"; if (E !== "px") { k.style[r] = (u || 1) + E; B = (u || 1) / z.cur(true) * B; k.style[r] = B + E } if (C[1]) u = (C[1] === "-=" ? -1 : 1) * u + B; z.custom(B, u, E) } else z.custom(B, u, "") } }); return true + }) + }, stop: function(a, b) { + var d = c.timers; a && this.queue([]); + this.each(function() { for (var f = d.length - 1; f >= 0; f--) if (d[f].elem === this) { b && d[f](true); d.splice(f, 1) } }); b || this.dequeue(); return this + } +}); c.each({ slideDown: K("show", 1), slideUp: K("hide", 1), slideToggle: K("toggle", 1), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide"} }, function(a, b) { c.fn[a] = function(d, f) { return this.animate(b, d, f) } }); c.extend({ speed: function(a, b, d) { + var f = a && typeof a === "object" ? a : { complete: d || !d && b || c.isFunction(a) && a, duration: a, easing: d && b || b && !c.isFunction(b) && b }; f.duration = c.fx.off ? 0 : typeof f.duration === +"number" ? f.duration : c.fx.speeds[f.duration] || c.fx.speeds._default; f.old = f.complete; f.complete = function() { f.queue !== false && c(this).dequeue(); c.isFunction(f.old) && f.old.call(this) }; return f +}, easing: { linear: function(a, b, d, f) { return d + f * a }, swing: function(a, b, d, f) { return (-Math.cos(a * Math.PI) / 2 + 0.5) * f + d } }, timers: [], fx: function(a, b, d) { this.options = b; this.elem = a; this.prop = d; if (!b.orig) b.orig = {} } +}); c.fx.prototype = { update: function() { + this.options.step && this.options.step.call(this.elem, this.now, this); (c.fx.step[this.prop] || +c.fx.step._default)(this); if ((this.prop === "height" || this.prop === "width") && this.elem.style) this.elem.style.display = "block" +}, cur: function(a) { if (this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null)) return this.elem[this.prop]; return (a = parseFloat(c.css(this.elem, this.prop, a))) && a > -10000 ? a : parseFloat(c.curCSS(this.elem, this.prop)) || 0 }, custom: function(a, b, d) { + function f(j) { return e.step(j) } this.startTime = J(); this.start = a; this.end = b; this.unit = d || this.unit || "px"; this.now = this.start; + this.pos = this.state = 0; var e = this; f.elem = this.elem; if (f() && c.timers.push(f) && !W) W = setInterval(c.fx.tick, 13) +}, show: function() { this.options.orig[this.prop] = c.style(this.elem, this.prop); this.options.show = true; this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); c(this.elem).show() }, hide: function() { this.options.orig[this.prop] = c.style(this.elem, this.prop); this.options.hide = true; this.custom(this.cur(), 0) }, step: function(a) { + var b = J(), d = true; if (a || b >= this.options.duration + this.startTime) { + this.now = +this.end; this.pos = this.state = 1; this.update(); this.options.curAnim[this.prop] = true; for (var f in this.options.curAnim) if (this.options.curAnim[f] !== true) d = false; if (d) { + if (this.options.display != null) { this.elem.style.overflow = this.options.overflow; a = c.data(this.elem, "olddisplay"); this.elem.style.display = a ? a : this.options.display; if (c.css(this.elem, "display") === "none") this.elem.style.display = "block" } this.options.hide && c(this.elem).hide(); if (this.options.hide || this.options.show) for (var e in this.options.curAnim) c.style(this.elem, +e, this.options.orig[e]); this.options.complete.call(this.elem) + } return false + } else { e = b - this.startTime; this.state = e / this.options.duration; a = this.options.easing || (c.easing.swing ? "swing" : "linear"); this.pos = c.easing[this.options.specialEasing && this.options.specialEasing[this.prop] || a](this.state, e, 0, 1, this.options.duration); this.now = this.start + (this.end - this.start) * this.pos; this.update() } return true +} +}; c.extend(c.fx, { tick: function() { + for (var a = c.timers, b = 0; b < a.length; b++) a[b]() || a.splice(b--, 1); a.length || +c.fx.stop() +}, stop: function() { clearInterval(W); W = null }, speeds: { slow: 600, fast: 200, _default: 400 }, step: { opacity: function(a) { c.style(a.elem, "opacity", a.now) }, _default: function(a) { if (a.elem.style && a.elem.style[a.prop] != null) a.elem.style[a.prop] = (a.prop === "width" || a.prop === "height" ? Math.max(0, a.now) : a.now) + a.unit; else a.elem[a.prop] = a.now } } +}); if (c.expr && c.expr.filters) c.expr.filters.animated = function(a) { return c.grep(c.timers, function(b) { return a === b.elem }).length }; c.fn.offset = "getBoundingClientRect" in s.documentElement ? +function(a) { var b = this[0]; if (a) return this.each(function(e) { c.offset.setOffset(this, a, e) }); if (!b || !b.ownerDocument) return null; if (b === b.ownerDocument.body) return c.offset.bodyOffset(b); var d = b.getBoundingClientRect(), f = b.ownerDocument; b = f.body; f = f.documentElement; return { top: d.top + (self.pageYOffset || c.support.boxModel && f.scrollTop || b.scrollTop) - (f.clientTop || b.clientTop || 0), left: d.left + (self.pageXOffset || c.support.boxModel && f.scrollLeft || b.scrollLeft) - (f.clientLeft || b.clientLeft || 0)} } : function(a) { + var b = +this[0]; if (a) return this.each(function(r) { c.offset.setOffset(this, a, r) }); if (!b || !b.ownerDocument) return null; if (b === b.ownerDocument.body) return c.offset.bodyOffset(b); c.offset.initialize(); var d = b.offsetParent, f = b, e = b.ownerDocument, j, i = e.documentElement, o = e.body; f = (e = e.defaultView) ? e.getComputedStyle(b, null) : b.currentStyle; for (var k = b.offsetTop, n = b.offsetLeft; (b = b.parentNode) && b !== o && b !== i; ) { + if (c.offset.supportsFixedPosition && f.position === "fixed") break; j = e ? e.getComputedStyle(b, null) : b.currentStyle; + k -= b.scrollTop; n -= b.scrollLeft; if (b === d) { k += b.offsetTop; n += b.offsetLeft; if (c.offset.doesNotAddBorder && !(c.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(b.nodeName))) { k += parseFloat(j.borderTopWidth) || 0; n += parseFloat(j.borderLeftWidth) || 0 } f = d; d = b.offsetParent } if (c.offset.subtractsBorderForOverflowNotVisible && j.overflow !== "visible") { k += parseFloat(j.borderTopWidth) || 0; n += parseFloat(j.borderLeftWidth) || 0 } f = j + } if (f.position === "relative" || f.position === "static") { k += o.offsetTop; n += o.offsetLeft } if (c.offset.supportsFixedPosition && +f.position === "fixed") { k += Math.max(i.scrollTop, o.scrollTop); n += Math.max(i.scrollLeft, o.scrollLeft) } return { top: k, left: n} +}; c.offset = { initialize: function() { + var a = s.body, b = s.createElement("div"), d, f, e, j = parseFloat(c.curCSS(a, "marginTop", true)) || 0; c.extend(b.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" }); b.innerHTML = "
    "; + a.insertBefore(b, a.firstChild); d = b.firstChild; f = d.firstChild; e = d.nextSibling.firstChild.firstChild; this.doesNotAddBorder = f.offsetTop !== 5; this.doesAddBorderForTableAndCells = e.offsetTop === 5; f.style.position = "fixed"; f.style.top = "20px"; this.supportsFixedPosition = f.offsetTop === 20 || f.offsetTop === 15; f.style.position = f.style.top = ""; d.style.overflow = "hidden"; d.style.position = "relative"; this.subtractsBorderForOverflowNotVisible = f.offsetTop === -5; this.doesNotIncludeMarginInBodyOffset = a.offsetTop !== j; a.removeChild(b); + c.offset.initialize = c.noop +}, bodyOffset: function(a) { var b = a.offsetTop, d = a.offsetLeft; c.offset.initialize(); if (c.offset.doesNotIncludeMarginInBodyOffset) { b += parseFloat(c.curCSS(a, "marginTop", true)) || 0; d += parseFloat(c.curCSS(a, "marginLeft", true)) || 0 } return { top: b, left: d} }, setOffset: function(a, b, d) { + if (/static/.test(c.curCSS(a, "position"))) a.style.position = "relative"; var f = c(a), e = f.offset(), j = parseInt(c.curCSS(a, "top", true), 10) || 0, i = parseInt(c.curCSS(a, "left", true), 10) || 0; if (c.isFunction(b)) b = b.call(a, +d, e); d = { top: b.top - e.top + j, left: b.left - e.left + i }; "using" in b ? b.using.call(a, d) : f.css(d) +} +}; c.fn.extend({ position: function() { + if (!this[0]) return null; var a = this[0], b = this.offsetParent(), d = this.offset(), f = /^body|html$/i.test(b[0].nodeName) ? { top: 0, left: 0} : b.offset(); d.top -= parseFloat(c.curCSS(a, "marginTop", true)) || 0; d.left -= parseFloat(c.curCSS(a, "marginLeft", true)) || 0; f.top += parseFloat(c.curCSS(b[0], "borderTopWidth", true)) || 0; f.left += parseFloat(c.curCSS(b[0], "borderLeftWidth", true)) || 0; return { top: d.top - +f.top, left: d.left - f.left} + }, offsetParent: function() { return this.map(function() { for (var a = this.offsetParent || s.body; a && !/^body|html$/i.test(a.nodeName) && c.css(a, "position") === "static"; ) a = a.offsetParent; return a }) } +}); c.each(["Left", "Top"], function(a, b) { + var d = "scroll" + b; c.fn[d] = function(f) { + var e = this[0], j; if (!e) return null; if (f !== w) return this.each(function() { if (j = wa(this)) j.scrollTo(!a ? f : c(j).scrollLeft(), a ? f : c(j).scrollTop()); else this[d] = f }); else return (j = wa(e)) ? "pageXOffset" in j ? j[a ? "pageYOffset" : +"pageXOffset"] : c.support.boxModel && j.document.documentElement[d] || j.document.body[d] : e[d] + } +}); c.each(["Height", "Width"], function(a, b) { + var d = b.toLowerCase(); c.fn["inner" + b] = function() { return this[0] ? c.css(this[0], d, false, "padding") : null }; c.fn["outer" + b] = function(f) { return this[0] ? c.css(this[0], d, false, f ? "margin" : "border") : null }; c.fn[d] = function(f) { + var e = this[0]; if (!e) return f == null ? null : this; if (c.isFunction(f)) return this.each(function(j) { var i = c(this); i[d](f.call(this, j, i[d]())) }); return "scrollTo" in +e && e.document ? e.document.compatMode === "CSS1Compat" && e.document.documentElement["client" + b] || e.document.body["client" + b] : e.nodeType === 9 ? Math.max(e.documentElement["client" + b], e.body["scroll" + b], e.documentElement["scroll" + b], e.body["offset" + b], e.documentElement["offset" + b]) : f === w ? c.css(e, d) : this.css(d, typeof f === "string" ? f : f + "px") + } +}); A.jQuery = A.$ = c + })(window); diff --git a/app/admin/library/jquery/jquery.tmpl.min.js b/app/admin/library/jquery/jquery.tmpl.min.js new file mode 100644 index 0000000..631fb75 --- /dev/null +++ b/app/admin/library/jquery/jquery.tmpl.min.js @@ -0,0 +1,10 @@ +/* + * jQuery Templates Plugin 1.0.0pre + * http://github.com/jquery/jquery-tmpl + * Requires jQuery 1.4.2 + * + * Copyright Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +(function (a) { var r = a.fn.domManip, d = "_tmplitem", q = /^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /, b = {}, f = {}, e, p = { key: 0, data: {} }, i = 0, c = 0, l = []; function g(e, d, g, h) { var c = { data: h || (d ? d.data : {}), _wrap: d ? d._wrap : null, tmpl: null, parent: d || null, nodes: [], calls: u, nest: w, wrap: x, html: v, update: t }; e && a.extend(c, e, { nodes: [], parent: d }); if (g) { c.tmpl = g; c._ctnt = c._ctnt || c.tmpl(a, c); c.key = ++i; (l.length ? f : b)[i] = c } return c } a.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (f, d) { a.fn[f] = function (n) { var g = [], i = a(n), k, h, m, l, j = this.length === 1 && this[0].parentNode; e = b || {}; if (j && j.nodeType === 11 && j.childNodes.length === 1 && i.length === 1) { i[d](this[0]); g = this } else { for (h = 0, m = i.length; h < m; h++) { c = h; k = (h > 0 ? this.clone(true) : this).get(); a(i[h])[d](k); g = g.concat(k) } c = 0; g = this.pushStack(g, f, i.selector) } l = e; e = null; a.tmpl.complete(l); return g } }); a.fn.extend({ tmpl: function (d, c, b) { return a.tmpl(this[0], d, c, b) }, tmplItem: function () { return a.tmplItem(this[0]) }, template: function (b) { return a.template(b, this[0]) }, domManip: function (d, m, k) { if (d[0] && a.isArray(d[0])) { var g = a.makeArray(arguments), h = d[0], j = h.length, i = 0, f; while (i < j && !(f = a.data(h[i++], "tmplItem"))); if (f && c) g[2] = function (b) { a.tmpl.afterManip(this, b, k) }; r.apply(this, g) } else r.apply(this, arguments); c = 0; !e && a.tmpl.complete(b); return this } }); a.extend({ tmpl: function (d, h, e, c) { var i, k = !c; if (k) { c = p; d = a.template[d] || a.template(null, d); f = {} } else if (!d) { d = c.tmpl; b[c.key] = c; c.nodes = []; c.wrapped && n(c, c.wrapped); return a(j(c, null, c.tmpl(a, c))) } if (!d) return []; if (typeof h === "function") h = h.call(c || {}); e && e.wrapped && n(e, e.wrapped); i = a.isArray(h) ? a.map(h, function (a) { return a ? g(e, c, d, a) : null }) : [g(e, c, d, h)]; return k ? a(j(c, null, i)) : i }, tmplItem: function (b) { var c; if (b instanceof a) b = b[0]; while (b && b.nodeType === 1 && !(c = a.data(b, "tmplItem")) && (b = b.parentNode)); return c || p }, template: function (c, b) { if (b) { if (typeof b === "string") b = o(b); else if (b instanceof a) b = b[0] || {}; if (b.nodeType) b = a.data(b, "tmpl") || a.data(b, "tmpl", o(b.innerHTML)); return typeof c === "string" ? (a.template[c] = b) : b } return c ? typeof c !== "string" ? a.template(null, c) : a.template[c] || a.template(null, q.test(c) ? c : a(c)) : null }, encode: function (a) { return ("" + a).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'") } }); a.extend(a.tmpl, { tag: { tmpl: { _default: { $2: "null" }, open: "if($notnull_1){_=_.concat($item.nest($1,$2));}" }, wrap: { _default: { $2: "null" }, open: "$item.calls(_,$1,$2);_=[];", close: "call=$item.calls();_=call._.concat($item.wrap(call,_));" }, each: { _default: { $2: "$index, $value" }, open: "if($notnull_1){$.each($1a,function($2){with(this){", close: "}});}" }, "if": { open: "if(($notnull_1) && $1a){", close: "}" }, "else": { _default: { $1: "true" }, open: "}else if(($notnull_1) && $1a){" }, html: { open: "if($notnull_1){_.push($1a);}" }, "=": { _default: { $1: "$data" }, open: "if($notnull_1){_.push($.encode($1a));}" }, "!": { open: ""} }, complete: function () { b = {} }, afterManip: function (f, b, d) { var e = b.nodeType === 11 ? a.makeArray(b.childNodes) : b.nodeType === 1 ? [b] : []; d.call(f, b); m(e); c++ } }); function j(e, g, f) { var b, c = f ? a.map(f, function (a) { return typeof a === "string" ? e.key ? a.replace(/(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g, "$1 " + d + '="' + e.key + '" $2') : a : j(a, e, a._ctnt) }) : e; if (g) return c; c = c.join(""); c.replace(/^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/, function (f, c, e, d) { b = a(e).get(); m(b); if (c) b = k(c).concat(b); if (d) b = b.concat(k(d)) }); return b ? b : k(c) } function k(c) { var b = document.createElement("div"); b.innerHTML = c; return a.makeArray(b.childNodes) } function o(b) { return new Function("jQuery", "$item", "var $=jQuery,call,_=[],$data=$item.data;with($data){_.push('" + a.trim(b).replace(/([\\'])/g, "\\$1").replace(/[\r\t\n]/g, " ").replace(/\$\{([^\}]*)\}/g, "{{= $1}}").replace(/\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g, function (m, l, k, d, b, c, e) { var j = a.tmpl.tag[k], i, f, g; if (!j) throw "Template command not found: " + k; i = j._default || []; if (c && !/\w$/.test(b)) { b += c; c = "" } if (b) { b = h(b); e = e ? "," + h(e) + ")" : c ? ")" : ""; f = c ? b.indexOf(".") > -1 ? b + h(c) : "(" + b + ").call($item" + e : b; g = c ? f : "(typeof(" + b + ")==='function'?(" + b + ").call($item):(" + b + "))" } else g = f = i.$1 || "null"; d = h(d); return "');" + j[l ? "close" : "open"].split("$notnull_1").join(b ? "typeof(" + b + ")!=='undefined' && (" + b + ")!=null" : "true").split("$1a").join(g).split("$1").join(f).split("$2").join(d ? d.replace(/\s*([^\(]+)\s*(\((.*?)\))?/g, function (d, c, b, a) { a = a ? "," + a + ")" : b ? ")" : ""; return a ? "(" + c + ").call($item" + a : d }) : i.$2 || "") + "_.push('" }) + "');}return _;") } function n(c, b) { c._wrap = j(c, true, a.isArray(b) ? b : [q.test(b) ? b : a(b).html()]).join("") } function h(a) { return a ? a.replace(/\\'/g, "'").replace(/\\\\/g, "\\") : null } function s(b) { var a = document.createElement("div"); a.appendChild(b.cloneNode(true)); return a.innerHTML } function m(o) { var n = "_" + c, k, j, l = {}, e, p, h; for (e = 0, p = o.length; e < p; e++) { if ((k = o[e]).nodeType !== 1) continue; j = k.getElementsByTagName("*"); for (h = j.length - 1; h >= 0; h--) m(j[h]); m(k) } function m(j) { var p, h = j, k, e, m; if (m = j.getAttribute(d)) { while (h.parentNode && (h = h.parentNode).nodeType === 1 && !(p = h.getAttribute(d))); if (p !== m) { h = h.parentNode ? h.nodeType === 11 ? 0 : h.getAttribute(d) || 0 : 0; if (!(e = b[m])) { e = f[m]; e = g(e, b[h] || f[h]); e.key = ++i; b[i] = e } c && o(m) } j.removeAttribute(d) } else if (c && (e = a.data(j, "tmplItem"))) { o(e.key); b[e.key] = e; h = a.data(j.parentNode, "tmplItem"); h = h ? h.key : 0 } if (e) { k = e; while (k && k.key != h) { k.nodes.push(j); k = k.parent } delete e._ctnt; delete e._wrap; a.data(j, "tmplItem", e) } function o(a) { a = a + n; e = l[a] = l[a] || g(e, b[e.parent.key + n] || e.parent) } } } function u(a, d, c, b) { if (!a) return l.pop(); l.push({ _: a, tmpl: d, item: this, data: c, options: b }) } function w(d, c, b) { return a.tmpl(a.template(d), c, b, this) } function x(b, d) { var c = b.options || {}; c.wrapped = d; return a.tmpl(a.template(b.tmpl), b.data, c, b.item) } function v(d, c) { var b = this._wrap; return a.map(a(a.isArray(b) ? b.join("") : b).filter(d || "*"), function (a) { return c ? a.innerText || a.textContent : a.outerHTML || s(a) }) } function t() { var b = this.nodes; a.tmpl(null, null, null, this).insertBefore(b[0]); a(b).remove() } })(jQuery) diff --git a/app/admin/login.html b/app/admin/login.html new file mode 100644 index 0000000..8928fc1 --- /dev/null +++ b/app/admin/login.html @@ -0,0 +1,88 @@ + + + + + + CMS Admin + + + + +
    +
    +
    +
    +
    +
    +
    +

    User Login

    +
    +

    + + +

    +

    + + +

    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + diff --git a/app/admin/views/.DS_Store b/app/admin/views/.DS_Store new file mode 100644 index 0000000..0502071 Binary files /dev/null and b/app/admin/views/.DS_Store differ diff --git a/app/admin/views/Admin/Index.html b/app/admin/views/Admin/Index.html new file mode 100644 index 0000000..de63969 --- /dev/null +++ b/app/admin/views/Admin/Index.html @@ -0,0 +1,18 @@ +
    +
    + +

    Dash Dash

    +
    + +
    +
    +

    Foo

    +
    + spider + spider +
    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Blog/Create.html b/app/admin/views/Blog/Create.html new file mode 100644 index 0000000..b61a956 --- /dev/null +++ b/app/admin/views/Blog/Create.html @@ -0,0 +1,37 @@ +
    +
    + +

    Create Blog

    +
    + +
    + + +
    + Save + Cancel +
    + +
    +

    + + +

    +

    + + +

    +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Blog/Edit.html b/app/admin/views/Blog/Edit.html new file mode 100644 index 0000000..1526009 --- /dev/null +++ b/app/admin/views/Blog/Edit.html @@ -0,0 +1,39 @@ +
    +
    + +

    Edit Blog

    +
    + +
    + + + +
    + Save + Delete + Cancel +
    +
    + +

    + Url: ${blog.url} +

    +

    + + +

    +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Blog/Index.html b/app/admin/views/Blog/Index.html new file mode 100644 index 0000000..da0e36b --- /dev/null +++ b/app/admin/views/Blog/Index.html @@ -0,0 +1,36 @@ +
    + +

    Blog List

    +
    + +
    + Create New + {{html $item.paging()}} +
    + + + + + + + + + + {{each blogs}} + + + + + + {{/each}} + +
    + Title + + Url + + Date +
    ${title} ${url}{{html $item.date(date)}}
    + \ No newline at end of file diff --git a/app/admin/views/Comment/Index.html b/app/admin/views/Comment/Index.html new file mode 100644 index 0000000..e10d5f8 --- /dev/null +++ b/app/admin/views/Comment/Index.html @@ -0,0 +1,30 @@ +
    + +

    Blog Comments

    +
    +
    + {{html $item.paging()}} +
    + + + + + + + + + {{each comments}} + + + + + {{/each}} + +
    + Comment + + Email +
    ${comment}${email}
    + \ No newline at end of file diff --git a/app/admin/views/Dash/Index.html b/app/admin/views/Dash/Index.html new file mode 100644 index 0000000..8815d27 --- /dev/null +++ b/app/admin/views/Dash/Index.html @@ -0,0 +1,14 @@ +
    +
    + +

    Dash Dash

    +
    + +
    +
    +

    Welcome!

    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/File/Index.html b/app/admin/views/File/Index.html new file mode 100644 index 0000000..03ffd70 --- /dev/null +++ b/app/admin/views/File/Index.html @@ -0,0 +1,33 @@ +
    + +
    + +

    Files

    + Upload +
    + + + + + + + + + + + {{each files}} + + + + + + {{/each}} + +
    + url + + full path +
    ${this}/content/files/${this}delete
    +
    \ No newline at end of file diff --git a/app/admin/views/File/Upload.html b/app/admin/views/File/Upload.html new file mode 100644 index 0000000..7a54a64 --- /dev/null +++ b/app/admin/views/File/Upload.html @@ -0,0 +1,21 @@ +
    +
    + +

    File Upload

    +
    +
    +
    +

    + + +

    +

    + Upload +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Page/Create.html b/app/admin/views/Page/Create.html new file mode 100644 index 0000000..47f2853 --- /dev/null +++ b/app/admin/views/Page/Create.html @@ -0,0 +1,38 @@ +
    +
    + +

    Create Page

    +
    + +
    + + +
    + Save + Cancel +
    + +
    +

    + + +

    +

    + + +

    + +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Page/Edit.html b/app/admin/views/Page/Edit.html new file mode 100644 index 0000000..468e434 --- /dev/null +++ b/app/admin/views/Page/Edit.html @@ -0,0 +1,39 @@ +
    +
    + +

    Edit Page

    +
    + +
    + + + +
    + Save + Delete + Cancel +
    +
    + +

    + + ${page.url} +

    +

    + + +

    +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Page/Index.html b/app/admin/views/Page/Index.html new file mode 100644 index 0000000..6a83edc --- /dev/null +++ b/app/admin/views/Page/Index.html @@ -0,0 +1,32 @@ +
    + +

    Page List

    +
    + +
    + Create New + {{html $item.paging()}} +
    + + + + + + + + + {{each pages}} + + + + + {{/each}} + +
    + Title + + Url +
    ${title} ${url}
    + \ No newline at end of file diff --git a/app/admin/views/Template/Index.html b/app/admin/views/Template/Index.html new file mode 100644 index 0000000..eb3bed1 --- /dev/null +++ b/app/admin/views/Template/Index.html @@ -0,0 +1,24 @@ +
    +
    + +

    Edit Temp

    +
    + +
    +
    + Save +
    +
    + +

    + + +

    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/User/Create.html b/app/admin/views/User/Create.html new file mode 100644 index 0000000..fa6b12f --- /dev/null +++ b/app/admin/views/User/Create.html @@ -0,0 +1,48 @@ +
    +
    + +

    New User Account

    +
    + +
    +
    + Submit + Cancel +
    +
    +

    User Info

    +
    + +

    + + +

    + +

    + + +

    +

    + + +

    + +

    + + +

    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/User/Edit.html b/app/admin/views/User/Edit.html new file mode 100644 index 0000000..aafdb91 --- /dev/null +++ b/app/admin/views/User/Edit.html @@ -0,0 +1,37 @@ +
    +
    + +

    Edit User Account

    +
    + +
    + +
    + Submit + Cancel +
    +
    +
    +

    + + +

    +

    + + +

    +

    + + +

    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/User/Index.html b/app/admin/views/User/Index.html new file mode 100644 index 0000000..500c78c --- /dev/null +++ b/app/admin/views/User/Index.html @@ -0,0 +1,44 @@ +
    + +

    User Accounts

    +
    + +
    + + +
    + + + + + + + + + + + + {{each users}} + + + + + + + {{/each}} + +
    + Name + + Type + + Email + + Date +
    ${name}${userType}${email}{{html $item.formatDate(date)}}
    + \ No newline at end of file diff --git a/app/admin/views/User/View.html b/app/admin/views/User/View.html new file mode 100644 index 0000000..8ace21b --- /dev/null +++ b/app/admin/views/User/View.html @@ -0,0 +1,29 @@ +
    +
    + +

    Edit User: ${user.name}

    +
    + +
    + +
    + Edit + Delete +
    + +
    +

    + User Name + ${user.name} +

    +

    + E-mail + ${user.email} +

    +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Zone/Create.html b/app/admin/views/Zone/Create.html new file mode 100644 index 0000000..d998202 --- /dev/null +++ b/app/admin/views/Zone/Create.html @@ -0,0 +1,32 @@ +
    +
    + +

    Create Zone

    +
    + +
    + +
    + Save + Cancel +
    +
    + +

    + + +

    +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Zone/Edit.html b/app/admin/views/Zone/Edit.html new file mode 100644 index 0000000..221cb95 --- /dev/null +++ b/app/admin/views/Zone/Edit.html @@ -0,0 +1,29 @@ +
    +
    + +

    E Z

    +
    + +
    + + +
    + Save + Delete + Cancel +
    +
    + +

    + + +

    + +
    +
    +
    \ No newline at end of file diff --git a/app/admin/views/Zone/Index.html b/app/admin/views/Zone/Index.html new file mode 100644 index 0000000..f247dbb --- /dev/null +++ b/app/admin/views/Zone/Index.html @@ -0,0 +1,37 @@ +
    + +

    Zone List

    +
    + +
    + +
    + Create New + {{html $item.paging()}} +
    +
    + + + + + + + + + + {{each zones}} + + + + + {{/each}} + +
    + Key + + Content +
    ${key} ${content}
    + \ No newline at end of file diff --git a/app/content/.DS_Store b/app/content/.DS_Store new file mode 100644 index 0000000..1a15e9a Binary files /dev/null and b/app/content/.DS_Store differ diff --git a/app/content/css/CMS.css b/app/content/css/CMS.css new file mode 100644 index 0000000..5a47b90 --- /dev/null +++ b/app/content/css/CMS.css @@ -0,0 +1,231 @@ +/* FONTS +------------------------------------------------------------*/ +body{font-family:"Segoe UI",Arial,sans-serif; background: url(../images/bc.png) repeat-x; } +h1, #sub_header h1{margin-bottom:1em; font-size:22px; color:#333; font-family:Helvetica Neue,Helvetica,Arial,sans-serif; text-shadow:1px 1px 1px #ccc;} +#container h2{margin-bottom:0.7em; font-family:Arial,sans-serif; color:#A9A9A9; font-size:20px;} +#container .box h2{font-size:26px;} +#container h3, #sub_header h3{margin-bottom:0.3em; font-size:13px;} +#container h4{ margin-bottom:0.3em;} +#container p, #sub_header p{margin-bottom:1em; font-size:100%;} +#container li, #sub_header li{ font-size:100%;} +.paging a, .paging span, .paging_top a, .paging_top span{font-family:Arial,sans-serif; font-size:16px} +#footer a, #footer p{color:#666;} + +/* LAYOUT +------------------------------------------------------------*/ +.half_width{ width:470px;} +.margin_bottom_10{ margin-bottom:10px;} +.margin_bottom_20{ margin-bottom:20px;} +.padding_bottom_20{ padding-bottom:20px;} + +ol.list li { list-style-type: decimal;} + +body{text-align:center; } +#wrap{} +#container, #header_inner, #footer_inner, #sub_header_inner, #container_inner{margin:0 auto; width:960px;} + +/*header*/ +#header{ + padding:0px 0; + height:60px; + background: url(../images/header_bc.png) repeat-x scroll 0px 0%; } + +/*logo*/ +.logo span{ +height:60px; +width:310px; position:relative; float:left; +top:8px; +display:block; +background: url(../images/logo.png) no-repeat scroll 0px 0%;} + +/*nav*/ +#nav li{display:inline;} +#nav li a +{ border-top:2px solid #444; + border-left:2px solid #444; + border-right:2px solid #444; + -moz-border-radius: 5px 5px 0px 0px; + -webkit-border-radius: 5px; +float:right; display:block; +padding:5px 10px; +color:#eee; +margin-right:10px; +text-decoration:none; +margin-top:20px; +background-color:#000; +color:#aaa;} +#nav li a:hover{ background-color:#111; color:#fff;} +.blog #nav li a.blog, +.index #nav li a.index, +.projects #nav li a.projects{ color:#558708;} + +#container .form p{ border:1px solid #fff; margin-bottom:5px;} +#container .form input[type="text"]{ width:200px;} + +/*footer*/ +#footer{ background-color: #F1F3F5; + border-top: 1px solid #DAE1E5; + font-size: 12px; + margin-top: 0; + padding: 25px 0; + text-align: left; } +#footer p{margin: 0 10px 10px 10px;} +#footer p a {color: #8596A0; margin-right: 20px;} +#footer .hr{border-bottom: 1px solid #DAE1E5; margin-bottom: 25px; padding-bottom: 25px;} +#footer li{ color:#ccc;} + +/*main*/ +#container{ padding-top:10px; margin-top:33px; padding-top:0px; padding-bottom:30px;} +#container div{ text-align: left;} +#left_col {float:right; width: 160px; } +#left_col ul li{margin-bottom: 10px;} +#right_col {width:780px; padding-left:0; float:left;} +#left_col_inner{padding:20px 20px 20px 0px;} + +#container .yellow_box{ padding:20px; background-color:#FFFFE0; border: 2px solid #E6DB55; margin-bottom:20px; + -moz-border-radius: 9px; + border-radius: 9px;} +#container .yellow_box p { margin:0; font-weight:bold;} + +/* box */ +#container .box +{ + background-color:#fff; + padding:20px; + border: 2px solid #ccc; + -moz-box-shadow:0 5px 20px #C8C8C8; + box-shadow:0 5px 20px #C8C8C8; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.height_270{height:310px;} +#container .light_blue{background-color: rgb(230, 238, 249);} +.margin_bottom5{ margin-bottom:5px;} + +/*sub header*/ +#sub_header{background-color:#e8e8e8;} +#sub_header .hide{display:none;} + +ul.sub_nav{ margin-bottom:10px; padding-bottom:10px; border-bottom:1px solid #ccc;} +ul.sub_nav li{ display: inline;} +ul.sub_nav li a{ display: block; padding:5px 10px; margin-right:10px; background-color:#ccc; + float: left;} +/* PAGE BLOCKS +------------------------------------------------------------*/ + +/* box: box overwrites */ +#container .box p, #container .box legend{color: #333;} +#container .box input[type="text"], #container .box select, #container .box textarea{ border:1px solid #ccc;} +#container .box .info_box p{color: #eee;} + +#container .box h1{ margin-bottom:10px;} + +#content1 ul.bank_list{list-style-type:none; margin:0px; padding:0px; padding-top: 7px;} + +.bank_list li{ float:left;} +.bank_list span { + display:block; + height:37px; + width:89px; + margin:0 7px 7px 0; + background: #fff url(/content/files/images/e723b5e7-62cf-45d2-84f5-eb0f44f08c99.png) no-repeat scroll 0 0;} + +.bank_list strong{ display:none;} +.bank_list .li2 span { background-position: 0 -38px} +.bank_list .li3 span { background-position: 0 -75px} +.bank_list .li4 span { background-position: 0 -110px} +.bank_list .li5 span { background-position: 0 -152px} +.bank_list .li6 span { background-position: 0 -188px} +.bank_list .li7 span { background-position: 0 -226px} +.bank_list .li8 span { background-position: 0 -262px} +.bank_list .li9 span { background-position: 0 -299px} +.bank_list .li10 span { background-position: 0 -337px} +.bank_list .li11 span { background-position: 0 -375px} +.bank_list .li12 span { background-position: 0 -414px} +.bank_list .li10, .bank_list .li11{ display:none;} + +/* Girl */ +.girl_wrapp{background: url(/content/files/images/4f761dfe-de1d-4245-b88a-7a6331e87f6c.jpg) no-repeat scroll 0px 0;} +.girl_wrapp .girl_wrapp_inner{background: url(/content/files/images/e3e17330-aae8-4db4-a557-6c4ac579cc95.gif) no-repeat scroll 0 151px;} + +.offer_text span{ font-size:44px; display:block; margin-left:180px; margin-top:8px; line-height:44px; margin-bottom:70px; text-align:right; color:#234F8C;} +.offer_text span strong{color: Red;} +.offer_text span i { color:#333;} + +.gray_box{ background-color:#eee; padding:10px;} +#container .gray_box p { margin-bottom:0;} +.form select{ width:200px;} +.form .gray_box select{ width:168px;} +#container .form .gray_box p { border-color:#eee;} + +/* +http://www.webdesignerwall.com/demo/css-buttons.html +*/ +.button { + display: inline-block; + outline: none; + cursor: pointer; + text-align: center; + text-decoration: none; + font: 14px/100% Arial, Helvetica, sans-serif; + padding: .5em 2em .55em; + text-shadow: 0 1px 1px rgba(0,0,0,.3); + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + /*border-radius: .5em;*/ + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.2); + box-shadow: 0 1px 2px rgba(0,0,0,.2); + font-weight:bold; +} +.button:hover { + text-decoration: none; +} +.button:active { + position: relative; + top: 1px; +} + +.orange { + color: #fef4e9; + border: solid 1px #da7c0c; + background: #f78d1d; + background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20)); + background: -moz-linear-gradient(top, #faa51a, #f47a20); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20'); +} +.orange:hover { + background: #f47c20; + background: -webkit-gradient(linear, left top, left bottom, from(#f88e11), to(#f06015)); + background: -moz-linear-gradient(top, #f88e11, #f06015); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015'); +} +.orange:active { + color: #fcd3a5; + background: -webkit-gradient(linear, left top, left bottom, from(#f47a20), to(#faa51a)); + background: -moz-linear-gradient(top, #f47a20, #faa51a); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f47a20', endColorstr='#faa51a'); +} + +/* green */ +.green { + color: #e8f0de; + border: solid 2px #538312; + background: #64991e; + background: -webkit-gradient(linear, left top, left bottom, from(#7db72f), to(#4e7d0e)); + background: -moz-linear-gradient(top, #7db72f, #4e7d0e); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7db72f', endColorstr='#4e7d0e'); +} +.green:hover { + background: #538018; + background: -webkit-gradient(linear, left top, left bottom, from(#6b9d28), to(#436b0c)); + background: -moz-linear-gradient(top, #6b9d28, #436b0c); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b9d28', endColorstr='#436b0c'); +} +.green:active { + color: #a9c08c; + background: -webkit-gradient(linear, left top, left bottom, from(#4e7d0e), to(#7db72f)); + background: -moz-linear-gradient(top, #4e7d0e, #7db72f); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4e7d0e', endColorstr='#7db72f'); +} \ No newline at end of file diff --git a/app/content/css/FNG.css b/app/content/css/FNG.css new file mode 100644 index 0000000..2c86338 --- /dev/null +++ b/app/content/css/FNG.css @@ -0,0 +1,155 @@ +/* DEFAULTS +------------------------------------------------------------*/ + +/* body */ +html{height: 100%;} +body {font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; margin: 0; padding:0; font-size:100%;} + +/* form */ +input, button, textarea, select, optgroup, option {font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit;} +input[type="text"] {width: 200px; border: 1px solid #CCC;} +input[type="password"] {width: 200px;border: 1px solid #CCC;} +fieldset {margin: 0px 0 20px 0; padding: 10px 30px; border: 1px solid #CCC;} +fieldset p {margin: 2px 10px 10px 0px;} +fieldset label, label {display: block;} +fieldset label.inline {display: inline;} +legend {font-size: 1.1em; font-weight: 600; text-align:left; padding: 2px 4px 8px 4px;} +input, button, textarea, select {*font-size: 100%;} /* purpose To enable resizing for IE @branch For IE6-Win, IE7-Win */ +textarea{ width:100%; height:100px;} + +/* table */ +table.data_table{border-collapse: collapse; border-spacing: 0; border-left: 1px solid #DBE1E6;} +table.data_table td, table.data_table th{padding:5px 10px; font-size:11px; } +table.data_table th{ background-color:#DBE1E6; color:#333;} +table.data_table th.header{ color:#fff; } +table.data_table td{ background-color:#f5f5f5; border-bottom: 1px solid #d4d8de; border-right: 1px solid #d4d8de;} +table.data_table tr.alt td{ background-color:#fff;} +table.data_table tr td.table_toolbar{ background-color:#6688a4;} + +/* text */ +h1, h2, h3, h4, h5, h6 {font-size: 100%;font-weight: normal;} +h1, h2, h3, h4, li, ul, p {text-align:left; font-size:100%; margin:0; padding:0; color:#333;} +h1, h2, h3, h4, h3 a {font-size: 110%; font-weight: bold;} +p, table{font-size:100%; line-height:160%;} +h1 span{ color:#ccc;} + +/*lists*/ +ul, li{ list-style-type: none; margin:0; padding:0; text-align:left;} +dl {text-align:left;} +dl dt {text-align:left; margin-left:10px;} +dl dt dd {text-align:left; margin-left:10px;} + +a {color:#105CB6;} +a:hover {text-decoration:none;} + +/* other */ +img {border: none; } +hr {height:1px; color:#F2F1E8; background: #F2F1E8; border:none;} +caption, +th {text-align: left;} + +/* reset +body, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td{ padding:0; margin:0} */ + +/* REUSABLES +------------------------------------------------------------*/ +/*message rounded box*/ + +.highlight{background-color: #ffc;} + +/*paging*/ +.paging{margin:10px 10px 0px 0px;} +.paging a, .paging span, .paging_top a, .paging_top span{display:block; + border:1px solid #888; float:left; padding:5px 10px; margin:1px; text-decoration:none; color:#888; font-size:11px;} +.paging a {cursor:pointer;} +.paging a.p{width:80px;} +.paging a.n{width:60px;} +.paging span{background-color:#888; color:#fff; font-weight:bold; border:1px solid #888; } +.paging span.pg_dots{background-color:#fff; color:#888; font-weight:bold; border:1px solid #fff; } +.paging a:hover, .paging_top a:hover{border:1px solid #222; background-color:#80A71F; color:#fff;} + +/*table paging*/ +.top_paging {margin-bottom:5px;} +.top_paging .previous span, .top_paging .next span{display:block; height:17px; cursor:pointer;} +.top_paging .previous, .top_paging .next{ display:block; margin-left:5px; float: left; height:17px; width:27px; border:1px solid #ccc;} +.top_paging .previous span{font-weight: bold; background: url(../images/icons/arrow_left.gif) no-repeat 50% 70%;} +.top_paging .next span{ font-weight: bold; background: url(../images/icons/arrow_right.gif) no-repeat 50% 70%;} +.top_paging select{ padding:0; margin-right: 10px; margin-left: 10px;} +.top_paging .previous, .top_paging .next{ -moz-background-clip:border; -moz-background-inline-policy:continuous; -moz-background-origin:padding; background:transparent url(http://d.yimg.com/a/i/ww/met/th/slate/gsprite_pg_slate_062209.gif) repeat-x scroll 0 0; border:1px solid #DBE1E6;} +.top_paging_status_text{line-height:16px;} + + +/* UTILITY +------------------------------------------------------------*/ +/*clearfix*/ +.clearfix:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +.clearfix { display: inline-block; } +/* start commented backslash hack \*/ +* html .clearfix { height: 1%; } +.clearfix { display: block; } +/* close commented backslash hack */ + +/*layout*/ +.clr {clear: both; height: 1px; overflow: hidden; visibility:hidden; display: block;} +.right{float:right} +.left{float:left} +.fl_none{float:none;} +.cl{clear: both;} +.hr{ padding-bottom:10px; margin-bottom:10px; border-bottom:1px solid #ccc;} + +/*text*/ +.red{color:Red} +.white{ color:#fff} +.grey { color: #ccc;} +.green{color:#80A71F} +.small{font-size:11px;} +.alpha{filter:alpha(opacity=35); -moz-opacity:0.35; opacity: 0.35;} +.alpha9{filter:alpha(opacity=90); -moz-opacity:0.90; opacity: 0.90;} +.italic{font-style:italic;} +.light_grety{color:#F2F1E8 } +input.grayout{background-color: #eee; background-image:none; border:none;} + +/*grid*/ +.margin {margin:10px;} +.padding_20{margin:20px;} +.padding_left{padding-left:10px;} +.padding_right{padding-right:10px;} +.margin_top {margin-top:10px;} +.margin_left{margin-left:10px;} +.margin_bottom{margin-bottom:10px;} +.margin_bottom_5{margin-bottom:5px;} +.margin_right{ margin-right:10px;} +.margin_right2{ margin-right:20px;} +.padding{ padding:10px;} +.padding_top{padding-top:10px;} +.background_none{background:none;} +.width_half{width:50%;} +.width_full{width:100%;} + +.align_right{ text-align:right;} + +/*other*/ +.hide{display:none;} + +/*list*/ +ul.list{padding-left:15px;} +ul.list li{list-style-type:disc;} + +/*icons*/ +.icon_add, .icon_edit, .icon_user, .icon_error +{padding:0px 0px 0px 20px;} +.icon_edit{background: url(../images/icons/icon_edit.gif) no-repeat 0px 50%;} +.icon_add{background: url(../images/icons/icon_add.gif) no-repeat 0px 50%;} +.icon_user{background: url(../images/icons/icon_user.png) no-repeat 4px 50%;} +.icon_blog{background: url(../images/icons/icon_blog.png) no-repeat 0px 50%;} +.icon_status{background: url(../images/icons/icon_done.png) no-repeat 4px 50%;} +.icon_error{background: url(../images/icons/error_add.png) no-repeat 4px 50%;} +.icon_idea{background: url(../images/icons/idea.png) no-repeat 4px 50%;} +.icon_help{background: url(../images/icons/help_contents.gif) no-repeat 4px 50%;} \ No newline at end of file diff --git a/app/content/files/.DS_Store b/app/content/files/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/app/content/files/.DS_Store differ diff --git a/app/content/files/sss.png b/app/content/files/sss.png new file mode 100644 index 0000000..9689c89 Binary files /dev/null and b/app/content/files/sss.png differ diff --git a/app/content/images/bc.png b/app/content/images/bc.png new file mode 100644 index 0000000..f03fa2a Binary files /dev/null and b/app/content/images/bc.png differ diff --git a/app/content/images/e723b5e7-62cf-45d2-84f5-eb0f44f08c99.png b/app/content/images/e723b5e7-62cf-45d2-84f5-eb0f44f08c99.png new file mode 100644 index 0000000..ba5ceb5 Binary files /dev/null and b/app/content/images/e723b5e7-62cf-45d2-84f5-eb0f44f08c99.png differ diff --git a/app/content/images/header_bc.png b/app/content/images/header_bc.png new file mode 100644 index 0000000..ad337ff Binary files /dev/null and b/app/content/images/header_bc.png differ diff --git a/app/content/js/.DS_Store b/app/content/js/.DS_Store new file mode 100644 index 0000000..676ea84 Binary files /dev/null and b/app/content/js/.DS_Store differ diff --git a/app/content/js/init.js b/app/content/js/init.js new file mode 100644 index 0000000..6833ccc --- /dev/null +++ b/app/content/js/init.js @@ -0,0 +1,103 @@ +(function($){ + + var fader = $('.fader'), + mapWrap = $('#mapWrap'), + win = $(window); + + // On load fader. + fader.fadeIn('slow'); + + var mapOkresy = $('path', mapWrap), + hoverOkres = $('#hoverOkres'); + + var closeAllPops = function(){ + $('.pop:visible').hide(); + + return false; + }; + + // Escape click + $(document).keyup(function(e) { + if (e.keyCode === 27) { + closeAllPops(); + } + }); + + $('.closePop').click(closeAllPops); + + var bindListings = function(){ + var listing = $('.listing'); + + listing.click(function(){ + var that = $(this), + guid = that.attr('guid'), + div = $('#' + guid); + + div.show().height(win.height() - 80); + /* + div.dialog({ + draggable: false, + modal: true, + resizable: false, + width: win.width() - 20, + height: win.height() - 20 + }); + */ + // TODO: tracking. + + //return false; + }); + + // Highlight current listing. + listing.hover(function(){ + $(this).addClass('highlight'); + }, function(){ + $(this).removeClass('highlight'); + }); + + }; + + // Bind page set. + bindListings($('.page_set')); + + // Map hovers. + mapOkresy.hover(function(){ + + var that = $(this), + name = that.attr('title'); + + that.attr('fill', '#000'); + hoverOkres.text('Byty v okrese ' + name); + hoverOkres.fadeIn(); + }, function(){ + + var that = $(this); + that.attr('fill', '#7DA7D8'); + }); + + // Map click. + mapOkresy.click(function(){ + + var that = $(this); + + that.attr('fill', '#f00'); + + var title = that.attr('title'), + url = MVC.util.string.createUrl(title); + + window.location.href = 'na-prodej/' + url; + + return false; + }); + + // Infinite scrolling. + win.scroll(function(){ + + var top = win.scrollTop(), + doc = $(document); + + if(top === (doc.height() - win.height())){ + //console.log('end'); + } + }); +}(jQuery)); \ No newline at end of file diff --git a/app/controllers/blog.js b/app/controllers/blog.js new file mode 100644 index 0000000..59d60ec --- /dev/null +++ b/app/controllers/blog.js @@ -0,0 +1,97 @@ + +// Libs. +var tmpl = require('jqtpl'), + ser = require('../lib/service'), + s = require('../lib/util.string') + c = require('../../config'), + Mongolian = require("mongolian"); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +var blogs = db.collection("blogs"), + zonesDb = db.collection("zones"); + +// Shared vars. +var zones = []; + +var helpers = { + htmlString: function(html){ + + try { + + // Search zones. + for(var i in zones) { + html = html.replace('{zone:' + zones[i].key + '}', zones[i].content); + } + + return html; + } catch (ex){ + return ex; + } + }, + date: function(date){ + + var d = new Date(date); + + return d.getDate() + "." + d.getMonth() + "." + d.getFullYear(); + }, + truncate: function(string, length){ + + // Remove HTML + string = string.replace(/<.*?>/g, ''); + + // Remove zone tags. + string = string.replace(/{.*?}/g, ''); + + return '

    ' + s.string.truncate(string, length) + '

    '; + } +}; + +// HTTP content getter. +exports.get = function(params, view, callBack){ + + var url = params.p1; + + + // Get zone list. + zonesDb.find().limit(50).toArray(function (err, zonesList) { + + // Zone list. + zones = zonesList; + + // Array to obj conversion. + var zone = {}; + for(var i in zones) { + zone[zones[i].key] = zones[i].content; + } + + if(url === ''){ + + // Page. + blogs.find().limit(50).toArray(function (err, list) { + + var content = tmpl.tmpl(view, {blogs: list, zone: zone}, helpers); + callBack(content); + }); + + // Show blog role + } else { + + // Page. + blogs.findOne({url: url}, function(err, obj) { + + //console.log(obj); + + var content = tmpl.tmpl(view, {blog: obj, zone: zone}, helpers); + callBack(content); + }); + } + + }); +}; \ No newline at end of file diff --git a/app/controllers/json.blog.js b/app/controllers/json.blog.js new file mode 100644 index 0000000..22c5544 --- /dev/null +++ b/app/controllers/json.blog.js @@ -0,0 +1,118 @@ +// Lib. +var tmpl = require('jqtpl'), + ser = require('../lib/service'), + c = require('../../config'), + a = require('../lib/util.array'), + Mongolian = require("mongolian"); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +var blogs = db.collection("blogs"), + comments = db.collection("comments"); + +// HTTP content getter. +exports.get = function(obj, callBack){ + + if(obj.action === 'list'){ + + var currentPage = parseInt(obj.params.p1), + recordsPerPage = parseInt(obj.params.p2), + startIndex = (currentPage * recordsPerPage) - recordsPerPage, + endIndex = startIndex + recordsPerPage - 1; + + blogs.find().limit(500).toArray(function (err, list) { + + var itemCount = list.length; + var pagedList = []; + + a.pager(list, startIndex, endIndex, function(i, item){ + pagedList.push(item); + }); + + // + callBack({ + blogs: pagedList, + blogCount: itemCount + }); + }); + } else if(obj.action === 'listcomments'){ + + var currentPage = parseInt(obj.params.p1), + recordsPerPage = parseInt(obj.params.p2), + startIndex = (currentPage * recordsPerPage) - recordsPerPage, + endIndex = startIndex + recordsPerPage - 1; + + //console.log(obj.params) + comments.find().limit(500).toArray(function (err, list) { + + var itemCount = list.length; + var commentList = []; + + a.pager(list, startIndex, endIndex, function(i, item){ + commentList.push(item); + }); + + // + callBack({ + comment: commentList, + commentCount: itemCount + }); + }); + } else if(obj.action === 'view'){ + + blogs.findOne({ url: obj.params.p1 }, function(err, blog) { + + callBack(blog); + }); + } else if(obj.action === 'update'){ + + // Save to db. + blogs.update({url: obj.params.url}, {$set: {body: obj.params.body}}); + blogs.update({url: obj.params.url}, {$set: {title: obj.params.title}}); + + // data + callBack(obj.params); + + } else if(obj.action === 'create'){ + + var now = new Date(); + + // Add date. + obj.params.date = now; //.toJSON(); + + // Save to db. + blogs.save(obj.params); + + // data + callBack(obj.params); + } else if(obj.action === 'createcomment'){ + + var now = new Date(); + + // Add date. + obj.params.date = now; //.toJSON(); + + // Status 0 for un-approved comment. + obj.params.status = 0; + + // Save to db. + comments.save(obj.params); + + // data + callBack(obj.params); + } else if(obj.action === 'delete'){ + + blogs.remove({url: obj.params.url}) + + // data + callBack(obj.params); + } else { + callBack({foo: 'page'}); + } +}; \ No newline at end of file diff --git a/app/controllers/json.file.js b/app/controllers/json.file.js new file mode 100644 index 0000000..1192597 --- /dev/null +++ b/app/controllers/json.file.js @@ -0,0 +1,29 @@ +// Lib. +var c = require('../../config'), + fs = require('fs'), + a = require('../lib/util.array'); + +// HTTP content getter. +exports.get = function(obj, callBack){ + + if(obj.action === 'list'){ + fs.readdir(c.config.appPath + '/content/files', function(err, data){ + callBack(data); + }); + } else if(obj.action === 'delete'){ + + var name = obj.params.name; + + fs.unlink(c.config.appPath + '/content/files/' + name, function(err, data){ + + if(err){ + console.log(err); + callBack(data); + } else { + callBack(data); + } + }); + } else { + callBack({foo: 'page'}); + } +}; \ No newline at end of file diff --git a/app/controllers/json.page.js b/app/controllers/json.page.js new file mode 100644 index 0000000..b1d5c7a --- /dev/null +++ b/app/controllers/json.page.js @@ -0,0 +1,79 @@ +// Lib. +var tmpl = require('jqtpl'), + ser = require('../lib/service'), + c = require('../../config'), + a = require('../lib/util.array'), + Mongolian = require("mongolian"); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +var pages = db.collection("pages"); + +// HTTP content getter. +exports.get = function(obj, callBack){ + + if(obj.action === 'list'){ + + var currentPage = parseInt(obj.params.p1), + recordsPerPage = parseInt(obj.params.p2), + startIndex = (currentPage * recordsPerPage) - recordsPerPage, + endIndex = startIndex + recordsPerPage - 1; + + pages.find().limit(500).toArray(function (err, list) { + + var itemCount = list.length; + var pagedList = []; + + a.pager(list, startIndex, endIndex, function(i, item){ + pagedList.push(item); + }); + + // + callBack({ + pages: pagedList, + pageCount: itemCount + }); + }); + } else if(obj.action === 'view'){ + + pages.findOne({ url: obj.params.p1 }, function(err, page) { + + callBack(page); + }); + } else if(obj.action === 'update'){ + + // Save to db. + pages.update({url: obj.params.url}, {$set: {body: obj.params.body}}); + pages.update({url:obj.params.url}, {$set: {title: obj.params.title}}); + + // data + callBack(obj.params); + + } else if(obj.action === 'create'){ + + var now = new Date(); + + // Add date. + obj.params.date = now; + + // Save to db. + pages.save(obj.params); + + // data + callBack(obj.params); + } else if(obj.action === 'delete'){ + + pages.remove({url: obj.params.url}) + + // data + callBack(obj.params); + } else { + callBack({foo: 'page'}); + } +}; \ No newline at end of file diff --git a/app/controllers/json.template.js b/app/controllers/json.template.js new file mode 100644 index 0000000..bf79da5 --- /dev/null +++ b/app/controllers/json.template.js @@ -0,0 +1,25 @@ +var fs = require('fs'), + c = require('../../config'); + +// HTTP content getter. +exports.get = function(params, callBack){ + + // Default value. + if(params.params.p1 === '1'){ + params.params.p1 = 'page.index'; + } + + if(params.action === 'get'){ + + fs.readFile(c.config.appPath + '/views/' + params.params.p1.replace('.', '/') + '.html', function (err, data) { + callBack({content: data.toString()}); + }); + } else if(params.action === 'update'){ + + fs.writeFile(c.config.appPath + '/views/' + params.params.page.replace('.', '/') + '.html', params.params.content, function (err) { + callBack({}); + }); + } else { + callBack({foo: 'temp'}); + } +}; \ No newline at end of file diff --git a/app/controllers/json.user.js b/app/controllers/json.user.js new file mode 100644 index 0000000..9e3cbbc --- /dev/null +++ b/app/controllers/json.user.js @@ -0,0 +1,156 @@ +// Lib. +var tmpl = require('jqtpl'), + c = require('../../config'), + fs = require('fs'), + Mongolian = require("mongolian"), + util = require('../lib/util.string'); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +// Data sets. +var users = db.collection("users"); + +// HTTP content getter. +exports.get = function(obj, callBack){ + + if(obj.action === 'getsession'){ + + var user = window.userSession[obj.cookies.userSession]; + + // Check if session is present, otherwise logout. + if(user){ + + // Choose menu model. + var menuModelUrl = '/models/menu.js'; + + fs.readFile(c.config.appPath + menuModelUrl, function (err, data) { + + var menuItems = JSON.parse(data); + + // User data. + var d = { + userName: user.name, + userType: user.userType, + guid: user.guid, + menuItems: menuItems + }; + + callBack(d); + + }); + } else { + callBack({}, false, false, 'you are logged out'); + } + } else if(obj.action === 'logout'){ + + // Delete user from user session object. + if(obj.cookies.userSession){ + delete window.userSession[obj.cookies.userSession]; + } + + // Set cookie to nothing. + callBack({ + cookie: obj.cookies + }, + { + key: 'userSession', + value: '' + }); + + } else if(obj.action === 'login'){ + + users.findOne({ + name: obj.params.name, + password: obj.params.password + }, function(err, record) { + + // If login sucesfull + if(record){ + + var sessionGuid = util.string.guid(); + + // Set. + window.userSession[sessionGuid] = record; + + // Callback + callBack({ + //record: record.length, + //users: window.userSession, + //cookies: obj.cookies, + //userName: obj.params.p1, + userSession: sessionGuid + }, + { + key: 'userSession', + value: sessionGuid + }); + + } else { + callBack({}, false, false); + } + + }); + } else if(obj.action === 'view'){ + + users.findOne({ guid: obj.params.p1 }, function(err, user) { + + // CB. + callBack({ + user: user + }); + }); + } else if(obj.action === 'list'){ + + users.find().limit(500).toArray(function (err, list) { + + // Chew. + var newList = []; + + list.forEach(function(d, i){ + + // Mute password. + d.password = 'not telling you :)'; + + newList.push(d); + }); + + callBack({users: newList}); + }); + } else if(obj.action === 'update'){ + + // Save to db. + users.update({guid: obj.params.guid}, {$set: {name: obj.params.name}}); + users.update({guid: obj.params.guid}, {$set: {password: obj.params.password}}); + users.update({guid: obj.params.guid}, {$set: {email: obj.params.email}}); + + // data + callBack(obj.params); + } else if(obj.action === 'create'){ + + var now = new Date(); + + // Add date. + obj.params.date = now; //now.toJSON(); + obj.params.guid = util.string.guid(); + + // Save to db. + users.save(obj.params); + + // data + callBack(obj.params); + } else if(obj.action === 'delete'){ + + users.remove({guid: obj.params.guid}); + + // data + callBack(obj.params); + } else { + callBack({}); + } +}; \ No newline at end of file diff --git a/app/controllers/json.zone.js b/app/controllers/json.zone.js new file mode 100644 index 0000000..6905ba0 --- /dev/null +++ b/app/controllers/json.zone.js @@ -0,0 +1,58 @@ +// Lib. +var tmpl = require('jqtpl'), + ser = require('../lib/service'), + c = require('../../config'), + Mongolian = require("mongolian"); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +var zones = db.collection("zones"); + +// HTTP content getter. +exports.get = function(obj, callBack){ + + if(obj.action === 'list'){ + + zones.find().limit(5).toArray(function (err, list) { + + callBack(list); + }); + } else if(obj.action === 'view'){ + + zones.findOne({ key: obj.params.p1 }, function(err, obj) { + callBack(obj); + }); + } else if(obj.action === 'update'){ + + // Save to db. + zones.update({key: obj.params.key}, {$set: {content: obj.params.content}}); + + // data + callBack(obj.params); + + } else if(obj.action === 'create'){ + + // Add date. + obj.params.date = Date.now(); + + // Save to db. + zones.save(obj.params); + + // data + callBack(obj.params); + } else if(obj.action === 'delete'){ + + zones.remove({key: obj.params.key}) + + // data + callBack(obj.params); + } else { + callBack({foo: 'zone'}); + } +}; \ No newline at end of file diff --git a/app/controllers/page.js b/app/controllers/page.js new file mode 100644 index 0000000..9f74770 --- /dev/null +++ b/app/controllers/page.js @@ -0,0 +1,123 @@ + +// Libs. +var tmpl = require('jqtpl'), + ser = require('../lib/service'), + c = require('../../config'), + Mongolian = require("mongolian"); + +// Db. +var server = new Mongolian(c.config.dbConnection), + db = server.db(c.config.dbName); + +if(c.config.dbConnection !== 'localhost'){ + db.auth(c.config.dbUserName, c.config.dbPassword); +} + +var pages = db.collection("pages"), + zonesDb = db.collection("zones"); + +// Shared vars. +var zones = []; + +var helpers = { + htmlString: function(html){ + + try { + + // Search zones. + for(var i in zones) { + html = html.replace('{zone:' + zones[i].key + '}', zones[i].content); + } + + return html; + } catch (ex){ + return ex; + } + } +}; + +// HTTP content getter. +exports.get = function(params, view, callBack){ + + var pageUrl = params.p1; + if(pageUrl === ''){ + pageUrl = 'index'; + } + + // Get zone list. + zonesDb.find().limit(50).toArray(function (err, zonesList) { + + // Zone list. + zones = zonesList; + + // Array to obj conversion. + var zone = {}; + for(var i in zones) { + zone[zones[i].key] = zones[i].content; + } + + // Page. + pages.findOne({url: pageUrl}, function(err, obj) { + + if(obj){ + + var content = tmpl.tmpl(view, { + page: obj, + zone: zone + }, helpers); + + callBack(content); + } else { + + // 404. + callBack('404 Page not found!'); + } + + }); + }); + + /* + ser.get('pages/detail', {url: pageUrl}, function(page){ + + ser.get('zone/list', {}, function(zoneList){ + + zones = zoneList.zone; + + // Merge model with template. + var content = tmpl.tmpl(view, {page: page.page}, helpers); + + // Spit content. + callBack(content); + }); + }); + + } else if(pageUrl === 'xxx'){ + + // Get data through service layer. + ser.get('hypoteky/list', {}, function(hypoteky){ + + // Merge model with template. + var content = tmpl.tmpl(view, hypoteky); + + // Spit content. + callBack(content); + }); + + } else { + + //hypoteka-ceske-sporitelny + + // Get data through service layer. + ser.get('hypoteky/detail', {pageUrl: pageUrl}, function(hypoteka){ + + console.log(hypoteka); + + // Merge model with template. + var content = tmpl.tmpl(view, hypoteka); + + // Spit content. + callBack(content); + }); + } + */ +}; \ No newline at end of file diff --git a/app/lib/file.js b/app/lib/file.js new file mode 100644 index 0000000..922d9b8 --- /dev/null +++ b/app/lib/file.js @@ -0,0 +1,51 @@ +var formidable = require('formidable'), + c = require('../../config'), + fs = require('fs'); + +exports.upload = function(req, res){ + + var form = new formidable.IncomingForm(); + + // Parse file. + form.parse(req, function(err, fields, files) { + + if(files.fileToUpload){ + + // Read file. + fs.readFile(files.fileToUpload.path, function(err, data){ + + // Save file. + fs.writeFile(c.config.appPath + '/content/files/' + + files.fileToUpload.name, + data, + 'utf8', + function (err) { + if (err){ + // throw err; + res.writeHead(200, {'content-type': 'text/plain'}); + res.write(JSON.stringify({ + isSucessful: false, + message: 'Something went wrong!' + })); + res.end(); + } else { + // Sucess. + res.writeHead(200, {'content-type': 'text/plain'}); + res.write(JSON.stringify({ + isSucessful: true, + message: 'File was saved!' + })); + res.end(); + } + }); + }); + } else { + res.writeHead(200, {'content-type': 'text/plain'}); + res.write(JSON.stringify({ + isSucessful: false, + message: 'Did not receive any file!' + })); + res.end(); + } + }); +}; \ No newline at end of file diff --git a/app/lib/html.helpers.js b/app/lib/html.helpers.js new file mode 100644 index 0000000..c09dacf --- /dev/null +++ b/app/lib/html.helpers.js @@ -0,0 +1,32 @@ +var util = require('./util.string') + +// Paging +exports.paging = function (settings) { + + //gets number of pages + var numberOfPages = (settings.numberofItems / settings.itemsPerPage).toFixed(); + + //add one if .toFixed() rounds down + if (settings.numberofItems > (numberOfPages * settings.itemsPerPage)) { + numberOfPages ++; + } + + var sb = util.string.stringBuilder(); + + //showes paging if needed + if (numberOfPages >= 1) { + + if (!(settings.currentPage == 1)) { + sb.append(" " + settings.previousText + ""); + } + if (!(settings.currentPage == numberOfPages)) { + + sb.append(" " + settings.nextText + ""); + } + + } + return sb.toString(); +}; \ No newline at end of file diff --git a/app/lib/jquery.js b/app/lib/jquery.js new file mode 100644 index 0000000..8cdc80e --- /dev/null +++ b/app/lib/jquery.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/app/lib/json.routes.js b/app/lib/json.routes.js new file mode 100644 index 0000000..348ae04 --- /dev/null +++ b/app/lib/json.routes.js @@ -0,0 +1,174 @@ + +var fs = require('fs'), + c = require('../../config'), + querystring = require('querystring'); + +// Router. +exports.get = function(req, resp){ + + // To Get a Cookie. + var cookies = {}; + req.headers.cookie && req.headers.cookie.split(';').forEach(function( cookie ) { + var parts = cookie.split('='); + cookies[parts[0].trim()] = (parts[1] || '').trim(); + }); + + var url = req.url.toLowerCase(), + arr = url.split('/'), + controller = 'json.page', + action = 'index', + p1 = '1', + p2 = '10', + p3 = ''; + + try{ + + if(arr[2]){ + controller = arr[2]; + } + + if(arr[3]){ + action = arr[3]; + } + + if(arr[4]){ + p1 = arr[4]; + } + + if(arr[5]){ + p2 = arr[5]; + } + + if(arr[6]){ + p3 = arr[6]; + } + + // Load controller. + var ctrl = require('../controllers/json.' + controller); + + if(req.method === 'POST'){ + + var _REQUEST = { }, + _CONTENT = ''; + + req.addListener('data', function(chunk) { + _CONTENT += chunk; + }); + + req.addListener('end', function() { + _REQUEST = querystring.parse(_CONTENT); + //callback(_REQUEST); + + // Load controller. + ctrl.get({ + controller: controller, + action: action, + cookies: cookies, + params: _REQUEST + }, + function(data, cookie, isSucessful, message){ + + var headers = {}; + + // Set cookie if suplied. + if(cookie){ + // Set headers. + headers = { + 'content-type': 'text/html', + 'Location': '/', + 'Set-Cookie': cookie.key + '=' + cookie.value, + }; + } else { + + // Set headers. + headers = { + 'content-type': 'text/html' + }; + } + + // Set defaults. + if(typeof isSucessful === 'undefined'){ + isSucessful = true; + } + + if(typeof message === 'undefined'){ + message = ''; + } + + resp.writeHead(200, headers); + resp.write(JSON.stringify({ + isSucessful: isSucessful, + message: message, + data: data + })); + resp.end(); + }); + }); + } else { + + // Load controller. + ctrl.get({ + controller: controller, + action: action, + cookies: cookies, + params: { + p1: p1, + p2: p2, + p3: p3 + } + }, + function(data, cookie, isSucessful, message){ + + var headers = {}; + + // Set cookie if suplied. + if(cookie){ + + // Set headers. + headers = { + 'content-type': 'text/html', + 'Location': '/', + 'Set-Cookie': cookie.key + '=' + cookie.value, + }; + + //var Cookies = require("cookies"); + //var c = new Cookies(req, resp, {}); + + } else { + + // Set headers. + headers = { + 'content-type': 'text/html' + }; + } + + // Set defaults. + if(typeof isSucessful === 'undefined'){ + isSucessful = true; + } + + if(typeof message === 'undefined'){ + message = ''; + } + + resp.writeHead(200, headers); + resp.write(JSON.stringify({ + isSucessful: isSucessful, + message: message, + data: data + })); + resp.end(); + }); + } + } catch(ex){ + + // Error page. + resp.writeHead(200, {'content-type': 'text/html'}); + resp.write(JSON.stringify({ + isSucessful: false, + message: 'something went wrong: ' + ex, + data: {} + })); + resp.end(); + } +}; \ No newline at end of file diff --git a/app/lib/loader.js b/app/lib/loader.js new file mode 100644 index 0000000..81024f3 --- /dev/null +++ b/app/lib/loader.js @@ -0,0 +1,66 @@ +var http = require('http'); + +// HTTP content getter. +exports.getContent = function(host, path, callBack, index){ + + // Fake user agent. + var firefox = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7'; + + try { + var request = http.request({ + //userAgent: firefox, // h['user-agent'] = this.userAgent; + 'user-agent': firefox, + host: host, + port: 80, + method: "GET", + path: path + }); + + request.on("response", function(response){ + + var body = ""; + + response.on("data", function(chunk){ + body += chunk; + }); + + response.on("end", function(){ + try { + + callBack({ + isSucessful: true, + body: body, + index: index + }); + } + catch (ex) { + callBack({ + isSucessful: false, + args: { + host: host, + path: path, + callBack: callBack, + index: index + }, + ex: ex + }); + } + }); + }); + + // End the request + request.end(); + } + catch (ex) { + callBack({ + isSucessful: false, + args: { + host: host, + path: path, + callBack: callBack, + index: index + }, + ex: ex + }); + } +}; \ No newline at end of file diff --git a/app/lib/routes.js b/app/lib/routes.js new file mode 100644 index 0000000..8f64280 --- /dev/null +++ b/app/lib/routes.js @@ -0,0 +1,71 @@ + +var fs = require('fs'), + c = require('../../config'); + +// Router. +exports.get = function(req, resp){ + + var url = req.url.toLowerCase(), + arr = url.split('/'), + controller = 'page', + action = 'index', + p1 = '', + p2 = '', + p3 = '', + p4 = ''; + + try{ + + // Routing. + if(arr[1] === 'blog'){ + + var controller = 'blog'; + + if(arr[2]){ + p1 = arr[2]; + action = 'detail'; + } + // Default route. + } else { + + if(arr[1]){ + p1 = arr[1]; + } + } + + // Load controller. + var ctrl = require('../controllers/' + controller); + + // Load view. + fs.readFile(c.config.appPath + '/views/' + controller + '/' + action + '.html', function (err, template) { + + var view = ''; + + if(template){ + view = template.toString(); + } + + // Load controller. + ctrl.get({ + controller: controller, + action: action, + p1: p1, + p2: p2, + p3: p3, + p4: p4 + }, + view, + function(content){ + resp.writeHead(200, {'content-type': 'text/html'}); + resp.write(content); + resp.end(); + }); + }); + } catch(ex){ + + // Error page. + resp.writeHead(200, {'content-type': 'text/html'}); + resp.write(ex); + resp.end(); + } +}; \ No newline at end of file diff --git a/app/lib/service.js b/app/lib/service.js new file mode 100644 index 0000000..5a66853 --- /dev/null +++ b/app/lib/service.js @@ -0,0 +1,112 @@ +var fs = require('fs'), + util = require('../lib/util.string'), + c = require('../../config'); + +// HTTP content getter. +exports.get = function(url, params, callBack){ + + if(url === 'foo'){ + + callBack({zone: 'foo'}); + + } else if(url === 'zone/detail'){ + + fs.readFile(c.config.appPath + '/Models/Zones.js', function (err, data) { + + var obj = JSON.parse(data), + zones = obj, + pageModel = {}; + + // Find detail record. + for(var i in zones) { + if(zones[i].zone_name === params.name){ + pageModel = zones[i]; + } + } + + // Send data back. + callBack({zone: pageModel}); + }); + + } else if(url === 'zone/list'){ + + fs.readFile(c.config.appPath + '/Models/Zones.js', function (err, data) { + + var obj = JSON.parse(data), + zones = obj, + pageModel = {}; + + // Send data back. + callBack({zone: zones}); + }); + + } else if(url === 'pages/detail'){ + + fs.readFile(c.config.appPath + '/Models/Pages.js', function (err, data) { + + var obj = JSON.parse(data), + pages = obj, + pageModel = {}; + + // Find detail record. + for(var i in pages) { + if(pages[i].page_url === params.url){ + pageModel = pages[i]; + } + } + + // Send data back. + callBack({page: pageModel}); + }); + } else if(url === 'pages/list'){ + + fs.readFile(c.config.appPath + '/Models/Pages.js', function (err, data) { + + var obj = JSON.parse(data), + pages = obj; + + // Send data back. + callBack({pages: pages}); + }); + } else if(url === 'hypoteky/list'){ + + fs.readFile(c.config.appPath + '/Models/Hypoteky.js', function (err, data) { + + var obj = JSON.parse(data), + hypoteky = obj.data.hypoteky; + + // Add urls. + for(var i in hypoteky) { + hypoteky[i].url = util.string.createUrl(hypoteky[i].loan); + } + + // Send data back. + callBack({hypoteky: hypoteky}); + }); + } else if(url === 'hypoteky/detail'){ + + fs.readFile(c.config.appPath + '/Models/Hypoteky.js', function (err, data) { + + var obj = JSON.parse(data), + hypoteky = obj.data.hypoteky, + pageModel; + + // Add urls. + for(var i in hypoteky) { + hypoteky[i].url = util.string.createUrl(hypoteky[i].loan); + } + + // Find detail record. + for(var i in hypoteky) { + if(hypoteky[i].url === params.url){ + pageModel = hypoteky[i]; + } + } + + // Send data back. + callBack({hypoteka: pageModel}); + }); + } else { + callBack({}); + } +}; \ No newline at end of file diff --git a/app/lib/util.array.js b/app/lib/util.array.js new file mode 100644 index 0000000..1cf1360 --- /dev/null +++ b/app/lib/util.array.js @@ -0,0 +1,76 @@ + +// Paging util. +exports.pager = function(list, start, end, callBack){ + for (i=start; i<=end; i++) { + // Prevent looping through items not in the object. + if(list[i]){ + callBack(i, list[i]); + } + } +}; + +// Arry to object with defined keys. +exports.decorate = function(obj, model, key, key2){ + + var newObj = []; + + for (var prop in obj) { + newObj[prop] = obj[prop]; + newObj[prop][key] = model[prop][key2]; + } + + return newObj; +}; + +// Arry to object with defined keys. +exports.groupCount = function(array, key){ + + var group = {}; + + array.forEach(function(d, i){ + + var keyName = d[key]; + + if(group[keyName]){ + group[keyName].count++; + } else { + + group[keyName] = { + count: 1, + key: keyName + }; + } + }); + + return group; +}; + +// Arry to object with defined keys. +exports.arrayToObj = function(array, key){ + + var obj = {}; + + array.forEach(function(d, i){ + + if(d[key]){ + obj[d[key]] = d; + } + }); + + return obj; +}; + +// Re-maps object. +exports.map = function(obj, map){ + + var newObj = {}; + + obj.forEach(function(d, i){ + + if(i === map.old){ + newObj[map.new] = d; + } + }); + + return newObj; +}; \ No newline at end of file diff --git a/app/lib/util.image.js b/app/lib/util.image.js new file mode 100644 index 0000000..c4ccf1b --- /dev/null +++ b/app/lib/util.image.js @@ -0,0 +1,51 @@ + +// Image downloader. + + +/* + Usage: + + var img = require('./lib/util.image'); + + img.download({ + host: 'www.google.com', + port: 80, + path: '/images/logos/ps_logo2.png', + targetFolder: '/', + targetName: 'logo.png' + }); +*/ + +var http = require('http'), + c = require('../../config'), + fs = require('fs'); + +exports.download = function(options){ + + var request = http.get(options, function(res){ + + var imagedata = ''; + res.setEncoding('binary'); + + // Chunk data. + res.on('data', function(chunk){ + imagedata += chunk; + }); + + // Fianlly. + res.on('end', function(){ + + // Save file. + fs.writeFile(c.config.appPath + options.targetFolder + options.targetName, imagedata, 'binary', function(err){ + if (err) throw err; + + //File was saved. + console.log('File saved.'); + + // Crear memory. + imagedata = ''; + }); + }); + }); +}; + diff --git a/app/lib/util.string.js b/app/lib/util.string.js new file mode 100644 index 0000000..938d25f --- /dev/null +++ b/app/lib/util.string.js @@ -0,0 +1,76 @@ +// String Util. +exports.string = { + guid: function() { + var S4 = function() { + return (((1+Math.random())*0x10000)|0).toString(16).substring(1); + }; + return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); + }, + truncate: function (string, length) { + + // Zero value calenup. + if (typeof string === "undefined" || string == null || string === '') { + return ""; + } + + // Return the same if short enough + if (string.length < length) { + return string; + } + + // Return truncated. + return string.substring(0, length); + }, + removeDoubleSpace: function(str){ + return str.replace(/\s{2,}/g, ' '); + }, + trim: function(str){ + str = str.replace(/^\s+/,''); + return str.replace(/\s+$/,''); + }, + createUrl: function(str) { + + // Cleanup string. + str = str.replace(/^\s+|\s+$/g, ""); + + var sF = "ěščřžýáíéĚŠČŘŽÝÁÍÉŮůÚúň", + sT = "escrzyaieescrzyaieuuuun", + from = sF.split(""), + to = sT.split(""), + length = from.length; + + for (var i = 0, l = length; i < l; i++) { + str = str.replace(new RegExp(from[i], "g"), to[i]); + } + + str = str.replace(/[^a-zA-Z0-9 -]/g, ""); + + str = str.replace(/^\s+|\s+$/g, ""); + + str = this.removeDoubleSpace(str); + + return str.replace(/\s+/g, "-").toLowerCase(); + }, + stringBuilder: function () { + + var s = []; + return { + // appends + append: function (v) { + if (v) { + s.push(v); + } + }, + // clears + clear: function () { + s.length = 1; + }, + // converts to string + toString: function () { + return s.join(""); + } + } + } +}; + + diff --git a/app/models/menu.js b/app/models/menu.js new file mode 100644 index 0000000..486a11f --- /dev/null +++ b/app/models/menu.js @@ -0,0 +1,65 @@ +[ + { + "url": "Dash", + "text": "Dash", + "items": [{ + "url": "Dash", + "text": "Dash" + }] + }, + { + "url": "Page", + "text": "Pages", + "items": [{ + "url": "Page", + "text": "Pages" + }, { + "url": "Zone", + "text": "Zones" + }] + }, + { + "url": "Template", + "text": "Template", + "items": [{ + "url": "Template/Index/page.index", + "text": "Page" + }, + { + "url": "Template/Index/blog.index", + "text": "Blog List" + }, + { + "url": "Template/Index/blog.detail", + "text": "Blog Detail" + }] + }, + { + "url": "Blog", + "text": "Blog", + "items": [{ + "url": "Blog", + "text": "Blog" + }, + { + "url": "Comment", + "text": "Comments" + }] + }, + { + "url": "File", + "text": "Files", + "items": [{ + "url": "File/Index", + "text": "List" + }] + }, + { + "url": "User", + "text": "Admin", + "items": [{ + "url": "User", + "text": "User" + }] + } +] \ No newline at end of file diff --git a/app/server.js b/app/server.js new file mode 100644 index 0000000..09bd359 --- /dev/null +++ b/app/server.js @@ -0,0 +1,51 @@ +// References. +var http = require('http'), + lightnode = require('lightnode'), + c = require('../config'), + routes = require('./lib/routes'), + file = require('./lib/file'), + jsonRoutes = require('./lib/json.routes'); + +// Set a global obj for cross controll reference. +// Just to keep faithful to the DOM :). +window = {}; +window.userSession = {}; + +// Create server. +var server = new http.Server(); +server.listen(c.config.portNumber); + +// Website static server. +var website = new lightnode.FileServer(c.config.staticContentPath); + +// Request. +website.delegateRequest = function(req, resp) { + + // Make non-case-sensitive. + var url = req.url.toLowerCase(); + + if (url.indexOf('/content') === 0){ + return website; + } else if (url.indexOf('/test') === 0){ + return website; + } else if (url.indexOf('/admin') === 0){ + return website; + } else if (url.indexOf('/upload') === 0){ + return file.upload(req, resp); + } else if (url.indexOf('/web') === 0){ + return website; + } else if (url.indexOf('/json') === 0){ + return jsonRoutes.get(req, resp); + } else { + return routes.get(req, resp); + } +}; + +// When a request comes to the ip server. +server.addListener('request', function(req, resp) { + + // 3 - serve all requests with the directory server + website.receiveRequest(req, resp); +}); + +console.log('http://localhost:' + c.config.portNumber + '/'); \ No newline at end of file diff --git a/app/views/.DS_Store b/app/views/.DS_Store new file mode 100644 index 0000000..50ac564 Binary files /dev/null and b/app/views/.DS_Store differ diff --git a/app/views/blog/detail.html b/app/views/blog/detail.html new file mode 100644 index 0000000..7cd0fe2 --- /dev/null +++ b/app/views/blog/detail.html @@ -0,0 +1,39 @@ + + + + ${blog.title} + + + + + + + +
    + {{html $item.htmlString(zone.header)}} +
    +

    ${blog.title}

    +

    {{html $item.date(blog.date)}}

    + {{html $item.htmlString(blog.body)}} + +
    +
    + +

    + + +

    +

    + + +

    +
    + +
    +
    +
    +
    + {{html $item.htmlString(zone.footer)}} +
    + + \ No newline at end of file diff --git a/app/views/blog/index.html b/app/views/blog/index.html new file mode 100644 index 0000000..0a9be05 --- /dev/null +++ b/app/views/blog/index.html @@ -0,0 +1,24 @@ + + + + Blog + + + + + + + +
    + {{html $item.htmlString(zone.header)}} +
    + {{each blogs}} +

    ${title}

    +

    {{html $item.date(date)}}

    + {{html $item.truncate(body, 900)}} + {{/each}} +
    + {{html $item.htmlString(zone.footer)}} +
    + + \ No newline at end of file diff --git a/app/views/page/index.html b/app/views/page/index.html new file mode 100644 index 0000000..21ab008 --- /dev/null +++ b/app/views/page/index.html @@ -0,0 +1,21 @@ + + + + + ${page.title} + + + + + +
    + {{html $item.htmlString(zone.header)}} +
    +
    + {{html $item.htmlString(page.body)}} +
    +
    +
    + {{html $item.htmlString(zone.footer)}} + + \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..4f4eedc --- /dev/null +++ b/config.js @@ -0,0 +1,12 @@ +exports.config = { + + staticContentPath: '/Users/dpirek/Sites/node/cms2/app', + appPath: '/Users/dpirek/Sites/node/cms2/app', + + dbConnection: 'localhost', + dbName: 'test', + dbUserName: '', + dbPassword: '', + + portNumber: 8075 +}; \ No newline at end of file