Retailon_Vzaar - Version 1.0.0

Version Notes

This extension was developed and tested on Magento 1.8. However it should work on all versions later than 1.5

Download this release

Release Info

Developer Hashid Hameed
Extension Retailon_Vzaar
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

Files changed (45) hide show
  1. app/code/community/Retailon/Vzaar/Block/Adminhtml/Alpha.php +27 -0
  2. app/code/community/Retailon/Vzaar/Block/Adminhtml/Alpha/Grid.php +79 -0
  3. app/code/community/Retailon/Vzaar/Block/Adminhtml/Renderer.php +20 -0
  4. app/code/community/Retailon/Vzaar/Block/Product/View.php +19 -0
  5. app/code/community/Retailon/Vzaar/Block/Product/View/Media.php +25 -0
  6. app/code/community/Retailon/Vzaar/Block/Videolist.php +15 -0
  7. app/code/community/Retailon/Vzaar/Helper/Data.php +51 -0
  8. app/code/community/Retailon/Vzaar/Model/Entity/Attribute/Source/Table/Videos.php +25 -0
  9. app/code/community/Retailon/Vzaar/Model/Observer.php +55 -0
  10. app/code/community/Retailon/Vzaar/Model/Resource/Setup.php +16 -0
  11. app/code/community/Retailon/Vzaar/Model/Resource/Vzaarlist.php +19 -0
  12. app/code/community/Retailon/Vzaar/Model/Resource/Vzaarlist/Collection.php +19 -0
  13. app/code/community/Retailon/Vzaar/Model/Videoplayer/Displaystyle.php +21 -0
  14. app/code/community/Retailon/Vzaar/Model/Vzaarlist.php +19 -0
  15. app/code/community/Retailon/Vzaar/controllers/Adminhtml/IndexController.php +62 -0
  16. app/code/community/Retailon/Vzaar/controllers/IndexController.php +24 -0
  17. app/code/community/Retailon/Vzaar/etc/config.xml +167 -0
  18. app/code/community/Retailon/Vzaar/etc/system.xml +95 -0
  19. app/code/community/Retailon/Vzaar/sql/vzaar_setup/mysql4-install-1.0.0.php +102 -0
  20. app/design/adminhtml/default/default/layout/vzaaradmin.xml +28 -0
  21. app/design/frontend/base/default/layout/retailonvzaar.xml +36 -0
  22. app/design/frontend/base/default/template/retailonvzaar/view.phtml +95 -0
  23. app/etc/modules/Retailon_Vzaar.xml +19 -0
  24. js/vzaar/blank.gif +0 -0
  25. js/vzaar/fancybox_loading.gif +0 -0
  26. js/vzaar/fancybox_loading@2x.gif +0 -0
  27. js/vzaar/fancybox_overlay.png +0 -0
  28. js/vzaar/fancybox_sprite.png +0 -0
  29. js/vzaar/fancybox_sprite@2x.png +0 -0
  30. js/vzaar/jquery.fancybox.css +274 -0
  31. js/vzaar/jquery.fancybox.pack.js +46 -0
  32. js/vzaar/jquery.min.js +7 -0
  33. js/vzaar/vzaar.js +18 -0
  34. lib/Vzaar/AccountType.php +74 -0
  35. lib/Vzaar/HttpRequest1.php +90 -0
  36. lib/Vzaar/OAuth.php +797 -0
  37. lib/Vzaar/UploadSignature.php +74 -0
  38. lib/Vzaar/User.php +86 -0
  39. lib/Vzaar/Video.php +92 -0
  40. lib/Vzaar/VideoDetails.php +161 -0
  41. lib/Vzaar/VideoList.php +54 -0
  42. lib/Vzaar/Vzaar.php +502 -0
  43. lib/Vzaar/VzaarException.php +35 -0
  44. lib/Vzaar/index.php +57 -0
  45. package.xml +26 -0
app/code/community/Retailon/Vzaar/Block/Adminhtml/Alpha.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+
14
+ class Retailon_Vzaar_Block_Adminhtml_Alpha extends Mage_Adminhtml_Block_Widget_Grid_Container
15
+ {
16
+ public function __construct(){
17
+ $this->_blockGroup = 'retailon_vzaar';
18
+ $this->_controller = 'adminhtml_alpha';
19
+ $this->_headerText = 'Videos from Vzaar';
20
+ $this->_addButtonLabel = $this->__('Reindex Videos');
21
+ parent::__construct();
22
+ }
23
+
24
+ public function getCreateUrl(){
25
+ return $this->getUrl('*/*/reload');
26
+ }
27
+ }
app/code/community/Retailon/Vzaar/Block/Adminhtml/Alpha/Grid.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Block_Adminhtml_Alpha_Grid extends Mage_Adminhtml_Block_Widget_Grid
14
+ {
15
+
16
+ public function __construct(){
17
+ parent::__construct();
18
+ $this->setDefaultSort('id');
19
+ $this->setId('retailon_vzaar_alpha_grid');
20
+ $this->setDefaultDir('asc');
21
+ $this->_emptyText = 'No videos available';
22
+ $this->setSaveParametersInSession(true);
23
+ }
24
+
25
+ public function getButtonHtml(){
26
+
27
+ }
28
+
29
+ protected function _getCollectionClass(){
30
+ return 'vzaar/vzaarlist';
31
+ }
32
+
33
+ protected function _prepareCollection(){
34
+ //$collection = Mage::getModel('vzaar/vzaarlist')->getCollection();
35
+ $collection = Mage::getModel('vzaar/vzaarlist')->getCollection();
36
+ $this->setCollection($collection);
37
+ return parent::_prepareCollection();
38
+ }
39
+
40
+ protected function _prepareColumns(){
41
+ $this->addColumn('id',
42
+ array(
43
+ 'header' => $this->__('ID'),
44
+ 'align' => 'right',
45
+ 'width' => '50px',
46
+ 'index' => 'id'
47
+ )
48
+ );
49
+ $this->addColumn('title',
50
+ array(
51
+ 'header' => 'Title',
52
+ 'index' => 'title'
53
+ ));
54
+
55
+ $this->addColumn('duration',
56
+ array(
57
+ 'header' => 'Duration',
58
+ 'index' => 'duration',
59
+ 'width' => '50px'
60
+ ));
61
+
62
+ $this->addColumn('video',
63
+ array(
64
+ 'header' => 'Action',
65
+ 'type' => 'text',
66
+ 'renderer' => 'Retailon_Vzaar_Block_Adminhtml_Renderer',
67
+ 'index' => 'duration',
68
+ 'width' => '50px',
69
+ 'sortable'=>false
70
+ ));
71
+
72
+ return parent::_prepareColumns();
73
+ }
74
+
75
+ /* public function getRowUrl($row){
76
+ return 'http://view.vzaar.com/'.$row->getId().'/player?autoplay=true';
77
+ }*/
78
+
79
+ }
app/code/community/Retailon/Vzaar/Block/Adminhtml/Renderer.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Block_Adminhtml_Renderer extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
14
+ {
15
+ public function render(Varien_Object $row){
16
+ $value = $row->getId();
17
+ $val = "<a class='vzaar fancybox.iframe' rel='group' href='http://view.vzaar.com/".$value."/player?autoplay=true'>Watch</a>";
18
+ return $val;
19
+ }
20
+ }
app/code/community/Retailon/Vzaar/Block/Product/View.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+
14
+ class Retailon_Vzaar_Block_Product_View extends Mage_Catalog_Block_Product_View
15
+ {
16
+ public function canEmailToFriend(){
17
+ return parent::canEmailToFriend();
18
+ }
19
+ }
app/code/community/Retailon/Vzaar/Block/Product/View/Media.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+
14
+ class Retailon_Vzaar_Block_Product_View_Media extends Mage_Catalog_Block_Product_View_Media
15
+ {
16
+ public function _toHtml()
17
+ {
18
+ if(Mage::getStoreConfig('vzaar_section/vzaar_group/beta_enable')){
19
+ $html = parent::_toHtml();
20
+ $html.=$this->getChildHtml('media_video');
21
+ return $html;
22
+ }
23
+ else return parent::_toHtml();
24
+ }
25
+ }
app/code/community/Retailon/Vzaar/Block/Videolist.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+ class Retailon_Vzaar_Block_Videolist extends Mage_Catalog_Block_Product_Abstract
13
+ {
14
+
15
+ }
app/code/community/Retailon/Vzaar/Helper/Data.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ require_once(Mage::getBaseDir('lib').'/Vzaar/Vzaar.php');
14
+ Vzaar::$token = Mage::getStoreConfig('vzaar_section/vzaar_group/beta_api');
15
+ Vzaar::$secret = Mage::getStoreConfig('vzaar_section/vzaar_group/beta_user');
16
+
17
+ class Retailon_Vzaar_Helper_Data extends Mage_Core_Helper_Abstract
18
+ {
19
+
20
+ public function getApiKey(){
21
+ return Mage::getStoreConfig('vzaar_section/vzaar_group/beta_api');
22
+ }
23
+
24
+ public function getUsername(){
25
+ return Mage::getStoreConfig('vzaar_section/vzaar_group/beta_user');
26
+ }
27
+
28
+ public function getVideoList($page=1){
29
+ return Vzaar::getVideoList($this->getUsername(), true,100,$page);
30
+ }
31
+
32
+ public function getVideoDetails($id){
33
+ return Vzaar::getVideoDetails($id,true,100);
34
+ }
35
+
36
+ public function getVideoNames(){
37
+ $collection=Mage::getModel('vzaar/vzaarlist')->getCollection();
38
+ //$listarr = array();
39
+ foreach ($collection as $video)
40
+ {
41
+ //$listarr[] = $video->getData('title');
42
+ $listarr[] = array("label"=>$video->getData('title'), "value"=>$video->getData('id'));
43
+ }
44
+ return $listarr;
45
+ }
46
+
47
+ public function getPages(){
48
+ $count = Vzaar::getUserDetails($this->getUsername());
49
+ return ceil($count->videoCount/100);
50
+ }
51
+ }
app/code/community/Retailon/Vzaar/Model/Entity/Attribute/Source/Table/Videos.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Entity_Attribute_Source_Table_Videos extends Mage_Eav_Model_Entity_Attribute_Source_Table
14
+ {
15
+ public function getAllOptions(){
16
+ $helper = Mage::helper('vzaarhelper');
17
+ $options = $helper->getVideoNames();
18
+ usort($options,array($this,'sortedVideos'));
19
+ return $options;
20
+ }
21
+
22
+ public function sortedVideos($a, $b){
23
+ return strcmp($a['label'],$b['label']);
24
+ }
25
+ }
app/code/community/Retailon/Vzaar/Model/Observer.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Observer
14
+ {
15
+ private $_processFlag;
16
+ public function setActiveVideos($observer){
17
+
18
+ if(!$this->_processFlag):
19
+ $this->_processFlag=true;
20
+ $_proid = $observer->getProduct()->getId();
21
+ $_product = Mage::getModel('catalog/product')->load($_proid);
22
+ $videos = $_product->getAttributeText('vzaarvid');
23
+ $active='';
24
+ if($videos==NULL) $active="None selected";
25
+ else if(!is_array($videos)) $active=$videos;
26
+ else{
27
+ foreach ($videos as $vid){
28
+ $active.=$vid.', ';
29
+ }}
30
+ $_store = $observer->getStoreId();
31
+ $action = Mage::getModel('catalog/resource_product_action');
32
+ $action->updateAttributes(array($_proid), array('vzaaractive'=>$active),$_store);
33
+ $_product->save();
34
+ endif;
35
+ }
36
+
37
+ /* public function setActiveVideos($observer){
38
+ $_product = $observer->getProduct()->getId();
39
+ $pro = Mage::getModel('catalog/product')->load($_product);
40
+ $attr = $pro->getResource()->getAttribute('vzaarvid');
41
+ if($attr->usesSource()){
42
+ $avid = $attr->getSource()->getOptionId('hashid');
43
+ $pro->setData('vzaaractive',$avid);
44
+ }
45
+ $haz = $pro->getAttributeText('vzaarvid');
46
+ //print_r( $_product->getAttributeText('vzaarvid'));
47
+ /* $pro->setData('name', "Hashid");
48
+ $pro->setData('vzaaractive', "Hashid");
49
+ $pro->setVzaaractive("Hashid");
50
+ //$pro->save();
51
+ //print_r($vid);
52
+ //print_r($haz);
53
+ //die();
54
+ }*/
55
+ }
app/code/community/Retailon/Vzaar/Model/Resource/Setup.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Resource_Setup extends Mage_Core_Model_Resource_Setup
14
+ {
15
+
16
+ }
app/code/community/Retailon/Vzaar/Model/Resource/Vzaarlist.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Resource_Vzaarlist extends Mage_Core_Model_Resource_Db_Abstract
14
+ {
15
+ public function _construct(){
16
+ $this->_init('vzaar/vzaarlist','id');
17
+ $this->_isPkAutoIncrement=false;
18
+ }
19
+ }
app/code/community/Retailon/Vzaar/Model/Resource/Vzaarlist/Collection.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Resource_Vzaarlist_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
14
+ {
15
+ public function _construct(){
16
+ parent::_construct();
17
+ $this->_init('vzaar/vzaarlist');
18
+ }
19
+ }
app/code/community/Retailon/Vzaar/Model/Videoplayer/Displaystyle.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Videoplayer_Displaystyle
14
+ {
15
+ public function toOptionArray(){
16
+ return array(
17
+ array('value'=>1,'label'=>'Inline (in image box)'),
18
+ array('value'=>0,'label'=>'Popup Lightbox')
19
+ );
20
+ }
21
+ }
app/code/community/Retailon/Vzaar/Model/Vzaarlist.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Model_Vzaarlist extends Mage_Core_Model_Abstract
14
+ {
15
+ public function _construct(){
16
+ parent::_construct();
17
+ $this->_init('vzaar/vzaarlist');
18
+ }
19
+ }
app/code/community/Retailon/Vzaar/controllers/Adminhtml/IndexController.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ class Retailon_Vzaar_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
14
+ {
15
+
16
+ protected function _initAction(){
17
+ $this->loadLayout()->_setActiveMenu('betamenu');
18
+ }
19
+ public function indexAction(){
20
+ $this->_initAction();
21
+ $this->getLayout()->getBlock('head')->setTitle('Vzaar Video List');
22
+ $this->renderLayout();
23
+ }
24
+
25
+ public function reloadAction(){
26
+ try{
27
+ Mage::getSingleton('core/resource')->getConnection('core_write')->query('truncate table vzaarvideos'); //delete all existing videos
28
+
29
+ $newvideos=array();
30
+ $helper = Mage::helper('vzaarhelper');
31
+
32
+ $db = Mage::getModel('vzaar/vzaarlist');
33
+ $pages = $helper->getPages(); //get number of pages
34
+ while($pages!=0):
35
+ $newvideos= array_merge($newvideos,$helper->getVideoList($pages--)); //loop all pages and save in array
36
+ endwhile;
37
+ foreach ($newvideos as $video)
38
+ {
39
+ //Inserting videos one by one into database
40
+ $db->setData('id',$video->id);
41
+ $db->setData('title',$video->title);
42
+ $db->setData('description',$video->description);
43
+ $duration = date('H:i:s', mktime(0, 0, $video->duration)); //converting seconds to HH:MM:SS format.
44
+ // $db->setData('duration',$video->duration);
45
+ $db->setData('duration',$duration);
46
+ $db->save();
47
+ }
48
+ Mage::getSingleton('adminhtml/session')->addSuccess('Reindexed videos from vzaar successfully');
49
+ }
50
+ catch(Exception $e){
51
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage().': Looks like the API credentials you entered in Vzaar Settings are incorrect!');
52
+ }
53
+
54
+ $this->_redirect('retailonvzaar/adminhtml_index/index');
55
+ }
56
+
57
+ public function truncateAction(){
58
+ Mage::getSingleton('core/resource')->getConnection('core_write')->query('truncate table vzaarvideos');
59
+ $this->_redirect('retailonvzaar/adminhtml_index/index');
60
+ }
61
+
62
+ }
app/code/community/Retailon/Vzaar/controllers/IndexController.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+
14
+ class Retailon_Vzaar_IndexController extends Mage_Core_Controller_Front_Action
15
+ {
16
+ public function indexAction(){
17
+ $this->loadLayout();
18
+ $this->renderLayout();
19
+ }
20
+
21
+ public function saveInDb(){
22
+
23
+ }
24
+ }
app/code/community/Retailon/Vzaar/etc/config.xml ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+ -->
14
+
15
+ <config>
16
+ <modules>
17
+ <Retailon_Vzaar>
18
+ <version>1.0.0</version>
19
+ </Retailon_Vzaar>
20
+ </modules>
21
+ <frontend>
22
+ <layout>
23
+ <updates>
24
+ <retailon_vzaar> <!--any name-->
25
+ <file>retailonvzaar.xml</file>
26
+ </retailon_vzaar>
27
+ </updates>
28
+ </layout>
29
+ <routers>
30
+ <betarouter>
31
+ <use>standard</use>
32
+ <args>
33
+ <module>Retailon_Vzaar</module>
34
+ <frontName>beta</frontName>
35
+ </args>
36
+ </betarouter>
37
+ </routers>
38
+ </frontend>
39
+ <adminhtml>
40
+ <layout>
41
+ <updates>
42
+ <retailon_vzaar>
43
+ <file>vzaaradmin.xml</file>
44
+ </retailon_vzaar>
45
+ </updates>
46
+ </layout>
47
+ <acl>
48
+ <resources>
49
+ <admin>
50
+ <children>
51
+ <system>
52
+ <children>
53
+ <config>
54
+ <children>
55
+ <vzaar_section translate="title">
56
+ <title>Beta</title>
57
+ <sort_order>100</sort_order>
58
+ </vzaar_section>
59
+ </children>
60
+ </config>
61
+ </children>
62
+ </system>
63
+ </children>
64
+ </admin>
65
+ </resources>
66
+ </acl>
67
+ <menu>
68
+ <betamenu module="adminhtml">
69
+ <title>Vzaar</title>
70
+ <sort_order>80</sort_order>
71
+ <children>
72
+ <vzaarlist>
73
+ <title>Video List</title>
74
+ <action>retailonvzaar/adminhtml_index/index</action>
75
+ </vzaarlist>
76
+ <betasettings>
77
+ <title>Settings</title>
78
+ <action>adminhtml/system_config/edit/section/vzaar_section</action>
79
+ <sort_order>999</sort_order>
80
+ </betasettings>
81
+ </children>
82
+ </betamenu>
83
+ </menu>
84
+ </adminhtml>
85
+ <global>
86
+ <blocks>
87
+ <retailon_vzaar>
88
+ <class>Retailon_Vzaar_Block</class>
89
+ </retailon_vzaar>
90
+ <catalog>
91
+ <!-- <rewrite>
92
+ <product_view>Retailon_Vzaar_Block_Product_View</product_view>
93
+ </rewrite>-->
94
+ <rewrite>
95
+ <product_view_media>Retailon_Vzaar_Block_Product_View_Media</product_view_media>
96
+ </rewrite>
97
+ </catalog>
98
+ </blocks>
99
+ <helpers>
100
+ <vzaarhelper>
101
+ <class>Retailon_Vzaar_Helper</class>
102
+ </vzaarhelper>
103
+ </helpers>
104
+ <models>
105
+ <vzaar>
106
+ <class>Retailon_Vzaar_Model</class>
107
+ <resourceModel>beta_resource</resourceModel>
108
+ </vzaar>
109
+ <beta_resource>
110
+ <class>Retailon_Vzaar_Model_Resource</class>
111
+ <entities>
112
+ <vzaarlist>
113
+ <table>vzaarvideos</table>
114
+ </vzaarlist>
115
+ </entities>
116
+ </beta_resource>
117
+ </models>
118
+ <resources>
119
+ <beta_write>
120
+ <connection>
121
+ <use>core_write</use>
122
+ </connection>
123
+ </beta_write>
124
+ <beta_read>
125
+ <connection>
126
+ <use>core_read</use>
127
+ </connection>
128
+ </beta_read>
129
+ <vzaar_setup>
130
+ <setup>
131
+ <module>Retailon_Vzaar</module>
132
+ <class>Retailon_Vzaar_Model_Resource_Setup</class>
133
+ </setup>
134
+ </vzaar_setup>
135
+ </resources>
136
+ <events>
137
+ <catalog_product_save_after>
138
+ <observers>
139
+ <retailon_vzaar>
140
+ <type>singleton</type>
141
+ <class>Retailon_Vzaar_Model_Observer</class>
142
+ <method>setActiveVideos</method>
143
+ </retailon_vzaar>
144
+ </observers>
145
+ </catalog_product_save_after>
146
+ </events>
147
+ </global>
148
+ <default>
149
+ <vzaar_section>
150
+ <vzaar_group>
151
+ <vzaar_autoplay>1</vzaar_autoplay>
152
+ <beta_enable>1</beta_enable>
153
+ </vzaar_group>
154
+ </vzaar_section>
155
+ </default>
156
+ <admin>
157
+ <routers>
158
+ <retailonvzaar>
159
+ <use>admin</use>
160
+ <args>
161
+ <module>Retailon_Vzaar</module>
162
+ <frontName>retailonvzaar</frontName>
163
+ </args>
164
+ </retailonvzaar>
165
+ </routers>
166
+ </admin>
167
+ </config>
app/code/community/Retailon/Vzaar/etc/system.xml ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <!--/**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */-->
13
+ <config>
14
+ <tabs>
15
+ <vzaar_tab>
16
+ <label>Retailon</label>
17
+ <sort_order>100</sort_order>
18
+ </vzaar_tab>
19
+ </tabs>
20
+ <sections>
21
+ <vzaar_section>
22
+ <label>Vzaar Videos</label>
23
+ <sort_order>100</sort_order>
24
+ <show_in_default>1</show_in_default>
25
+ <show_in_website>1</show_in_website>
26
+ <show_in_store>1</show_in_store>
27
+ <tab>vzaar_tab</tab>
28
+ <groups>
29
+ <vzaar_group>
30
+ <label>Vzaar Settings</label>
31
+ <show_in_default>1</show_in_default>
32
+ <show_in_website>1</show_in_website>
33
+ <show_in_store>1</show_in_store>
34
+ <expanded>1</expanded>
35
+ <fields>
36
+ <beta_user>
37
+ <label>Username</label>
38
+ <comment>Enter your vzaar username</comment>
39
+ <frontend_type>text</frontend_type>
40
+ <show_in_default>1</show_in_default>
41
+ <show_in_website>1</show_in_website>
42
+ <show_in_store>1</show_in_store>
43
+ <sort_order>100</sort_order>
44
+ </beta_user>
45
+ <beta_api>
46
+ <label>Enter your API Key</label>
47
+ <comment>Please obtain the key from your dashboard on vzaar.com</comment>
48
+ <frontend_type>text</frontend_type>
49
+ <show_in_default>1</show_in_default>
50
+ <show_in_website>1</show_in_website>
51
+ <show_in_store>1</show_in_store>
52
+ <sort_order>200</sort_order>
53
+ </beta_api>
54
+ <beta_enable>
55
+ <label>Enable the module</label>
56
+ <frontend_type>select</frontend_type>
57
+ <source_model>adminhtml/system_config_source_yesno</source_model>
58
+ <show_in_default>1</show_in_default>
59
+ <show_in_website>1</show_in_website>
60
+ <show_in_store>1</show_in_store>
61
+ <sort_order>50</sort_order>
62
+ </beta_enable>
63
+ <vzaar_autoplay>
64
+ <label>Autoplay Videos</label>
65
+ <frontend_type>select</frontend_type>
66
+ <source_model>adminhtml/system_config_source_yesno</source_model>
67
+ <show_in_default>1</show_in_default>
68
+ <show_in_website>1</show_in_website>
69
+ <show_in_store>1</show_in_store>
70
+ <sort_order>500</sort_order>
71
+ </vzaar_autoplay>
72
+ <vzaar_style>
73
+ <label>Display Style</label>
74
+ <frontend_type>select</frontend_type>
75
+ <source_model>Retailon_Vzaar_Model_Videoplayer_Displaystyle</source_model>
76
+ <show_in_default>1</show_in_default>
77
+ <show_in_website>1</show_in_website>
78
+ <show_in_store>1</show_in_store>
79
+ <sort_order>400</sort_order>
80
+ </vzaar_style>
81
+ <vzaar_globalvid>
82
+ <label>Default Videos</label>
83
+ <comment>These appear for all products. Enter Video IDs separated by comma. Eg: 1234567,1485938,1203948</comment>
84
+ <frontend_type>text</frontend_type>
85
+ <show_in_default>1</show_in_default>
86
+ <show_in_website>1</show_in_website>
87
+ <show_in_store>1</show_in_store>
88
+ <sort_order>600</sort_order>
89
+ </vzaar_globalvid>
90
+ </fields>
91
+ </vzaar_group>
92
+ </groups>
93
+ </vzaar_section>
94
+ </sections>
95
+ </config>
app/code/community/Retailon/Vzaar/sql/vzaar_setup/mysql4-install-1.0.0.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */
12
+
13
+ $installer = $this;
14
+ $installer->startSetup();
15
+ $setup = new Mage_Eav_Model_Entity_Setup('core_setup');
16
+ try{
17
+ $installer->run("SELECT * FROM {$this->getTable('vzaar/vzaarlist')}");
18
+ }
19
+ catch (Exception $e){
20
+ $installer->run("CREATE TABLE IF NOT EXISTS {$this->getTable('vzaar/vzaarlist')} (
21
+ `id` int(10) NOT NULL,
22
+ `title` varchar(100) NOT NULL,
23
+ `duration` time,
24
+ PRIMARY KEY (`id`)
25
+ )ENGINE=InnoDB DEFAULT CHARSET=utf8");
26
+ }
27
+
28
+ $setup->addAttributeGroup('catalog_product','Default','Vzaar Video',1000);
29
+ $setup->addAttribute('catalog_product','vzaarvid',array(
30
+ 'group'=>'Vzaar Video',
31
+ 'input'=>'multiselect',
32
+ 'sort_order'=>0,
33
+ 'label'=>'Video',
34
+ 'note'=>'Select multiple videos by holding CTRL key',
35
+ 'visible'=>1,
36
+ 'backend'=>'eav/entity_attribute_backend_array',
37
+ 'required'=>0,
38
+ 'user_defined'=>1,
39
+ 'searchable'=>0,
40
+ 'filterable'=>0,
41
+ 'visible_on_front'=>0,
42
+ 'visible_in_advanced_search' => 0,
43
+ 'is_html_allowed_on_front' => 0,
44
+ 'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
45
+ 'source'=>'vzaar/entity_attribute_source_table_videos'
46
+ ));
47
+
48
+ $setup->addAttribute('catalog_product','vzaarvidid',array(
49
+ 'group'=>'Vzaar Video',
50
+ 'input'=>'text',
51
+ 'label'=>'Video IDs',
52
+ 'sort_order'=>1,
53
+ 'note'=>'Enter Video IDs separated by comma. Eg: 14234,143563,134567',
54
+ 'visible'=>1,
55
+ 'backend'=>'eav/entity_attribute_backend_array',
56
+ 'required'=>0,
57
+ 'user_defined'=>1,
58
+ 'searchable'=>0,
59
+ 'filterable'=>0,
60
+ 'visible_on_front'=>0,
61
+ 'visible_in_advanced_search' => 0,
62
+ 'is_html_allowed_on_front' => 0,
63
+ 'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
64
+ 'source'=>'vzaar/entity_attribute_source_table_videos'
65
+ ));
66
+
67
+ $setup->addAttribute('catalog_product','vzaaractive',array(
68
+ 'group'=>'Vzaar Video',
69
+ 'input'=>'label',
70
+ 'type'=>'varchar',
71
+ 'sort_order'=>2,
72
+ 'label'=>'Currently Selected Videos',
73
+ 'visible'=>1,
74
+ 'backend'=>'',
75
+ 'required'=>0,
76
+ 'user_defined'=>1,
77
+ 'searchable'=>0,
78
+ 'filterable'=>0,
79
+ 'visible_on_front'=>0,
80
+ 'visible_in_advanced_search' => 0,
81
+ 'is_html_allowed_on_front' => 0,
82
+ 'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE
83
+ ));
84
+
85
+ $setup->addAttribute('catalog_category','vzaarcat',array(
86
+ 'group'=>'Vzaar Video',
87
+ 'input'=>'text',
88
+ 'type'=>'varchar',
89
+ 'label'=>'Video IDs',
90
+ 'note'=>'Enter Video IDs separated by comma. Eg: 14234,143563,134567',
91
+ 'visible'=>1,
92
+ 'backend'=>'',
93
+ 'required'=>0,
94
+ 'user_defined'=>1,
95
+ 'searchable'=>0,
96
+ 'filterable'=>0,
97
+ 'visible_on_front'=>0,
98
+ 'visible_in_advanced_search' => 0,
99
+ 'is_html_allowed_on_front' => 0,
100
+ 'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE
101
+ ));
102
+ $installer->endSetup();
app/design/adminhtml/default/default/layout/vzaaradmin.xml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <!--/**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */-->
13
+ <layout version="0.1.0">
14
+ <retailonvzaar_adminhtml_index_index>
15
+ <reference name="head">
16
+ <action method="addJs"><script>vzaar/jquery.min.js</script></action>
17
+ <action method="addJs"><script>vzaar/jquery.fancybox.pack.js</script></action>
18
+ <action method="addJs"><script>vzaar/vzaar.js</script></action>
19
+ <action method="addItem">
20
+ <type>js_css</type>
21
+ <name>vzaar/jquery.fancybox.css</name>
22
+ </action>
23
+ </reference>
24
+ <reference name="content">
25
+ <block type="retailon_vzaar/adminhtml_alpha" name="videolist"/>
26
+ </reference>
27
+ </retailonvzaar_adminhtml_index_index>
28
+ </layout>
app/design/frontend/base/default/layout/retailonvzaar.xml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <layout version="0.1.0">
2
+ <!--/**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: me@hashid.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */-->
12
+ <betarouter_index_index>
13
+ <reference name="content">
14
+ <block type="retailon_vzaar/videolist" name="vzaarlist" template="beta/beta.phtml"/>
15
+ </reference>
16
+ </betarouter_index_index>
17
+ <catalog_product_view translate="label">
18
+ <reference name="head">
19
+ <action method="addJs"><script>vzaar/jquery.min.js</script></action>
20
+ <!--<action method="addJs"><script>vzaar/vzaar.js</script></action>-->
21
+ <action method="addJs"><script>vzaar/jquery.fancybox.pack.js</script></action>
22
+ <action method="addItem">
23
+ <type>js_css</type>
24
+ <name>vzaar/jquery.fancybox.css</name>
25
+ </action>
26
+ </reference>
27
+ <reference name="content">
28
+ <reference name="product.info">
29
+ <reference name="product.info.media">
30
+ <block type="retailon_vzaar/videolist" name="mylist" as="media_video" template="retailonvzaar/view.phtml"
31
+ before="-"/>
32
+ </reference>
33
+ </reference>
34
+ </reference>
35
+ </catalog_product_view>
36
+ </layout>
app/design/frontend/base/default/template/retailonvzaar/view.phtml ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * This magento extension is created by RetailOn Inc for Vzaar.
5
+ * Visit us at http://www.retailon.net
6
+ * Author: Hashid Hameed
7
+ * Email: me@hashid.in
8
+ * Date: 25/2/14
9
+ * Time: 1:03 PM
10
+ *
11
+ * Please do not reproduce any part of the extension without prior permission.
12
+ */
13
+
14
+ //$videos = $videos2 = $videoscat = $globalvid = array();
15
+ $_product = $this->getProduct();
16
+ $videos = $_product->getVzaarvid();
17
+ $videos=explode(',',$videos);
18
+ $videos2 = $_product->getVzaarvidid();
19
+ $videos2=explode(',',$videos2);
20
+ $_helper=Mage::helper('catalog/output');
21
+ if ($_category_detail = Mage::registry('current_category'))
22
+ $videoscat = $_category_detail->getVzaarcat();
23
+ $videoscat=explode(',',$videoscat);
24
+
25
+ $globalvid = Mage::getStoreConfig('vzaar_section/vzaar_group/vzaar_globalvid');
26
+ $globalvid = explode(',',$globalvid);
27
+
28
+ $videos = array_merge($videos2,$videos, $videoscat, $globalvid); //merging all the video arrays from Category, Product (2) and Default
29
+
30
+ $autoplay = Mage::getStoreConfig('vzaar_section/vzaar_group/vzaar_autoplay');
31
+ if($autoplay) $autoplay="true";
32
+ else $autoplay ="false";
33
+ ?>
34
+ <?php if(array_filter($videos)) {
35
+ echo '<div class="more-views"><h2>Videos</h2><ul>';
36
+ }
37
+ ?>
38
+ <?php foreach ($videos as $vid)
39
+ {
40
+ if($vid!=''):
41
+ echo'<li>
42
+ <a id="'.$vid.'" class="vzaar fancybox.iframe" rel="group" href="http://view.vzaar.com/'.$vid.'/player?autoplay='.$autoplay.'">
43
+ <img src = "http://view.vzaar.com/'.$vid.'/thumb" height="100%" width="100%"/>
44
+ </a>
45
+ </li>';
46
+ endif;
47
+ }
48
+ ?>
49
+ </ul></div>
50
+ <?php if(Mage::getStoreConfig('vzaar_section/vzaar_group/vzaar_style')): ?>
51
+ <script type="text/javascript">
52
+ var jq = jQuery.noConflict();
53
+ jq(document).ready(function(){
54
+ jq(".vzaar").click(function(e){
55
+ e.preventDefault();
56
+ jq(".product-image").empty();
57
+ jq(".zoom").remove();
58
+ jq(".zoom-notice").remove();
59
+ /*jq(".product-image").append('<div style="margin:auto !important;position: absolute !important;top:0 !important;' +
60
+ 'left:0 !important;bottom:0 !important;right:0 !important;height:50px;width:50px"' +
61
+ 'id="vzaarloading"><img src="<?php echo Mage::getBaseUrl('js') ?>/vzaar/ajax-loader.gif"/></div>');*/
62
+ var vid = this.id;
63
+ var embed = '<iframe allowFullScreen allowTransparency="true"' +
64
+ 'class="vzaar-video-player" frameborder="0" height="221"' +
65
+ 'id="vzvd-'+vid+'" mozallowfullscreen name="vzvd-'+vid+'" src="http://view.vzaar.com/'+vid+'/player?autoplay=<?php echo $autoplay ?>"' +
66
+ 'title="vzaar video player" type="text/html" webkitAllowFullScreen width="265"></iframe>';
67
+ jq(".product-image").append(embed);
68
+ jq(".vzaar-video-player").load(function(){
69
+ // jq("#vzaarloading").remove();
70
+ });
71
+ });
72
+ });
73
+ </script>
74
+ <?php endif; ?>
75
+ <?php if(!Mage::getStoreConfig('vzaar_section/vzaar_group/vzaar_style')): ?>
76
+ <script type="text/javascript">
77
+ var jq = jQuery.noConflict();
78
+ jq(document).ready(function() {
79
+ jq(".vzaar").fancybox({
80
+ maxWidth : 800,
81
+ maxHeight : 600,
82
+ fitToView : true,
83
+ /* width : '70%',
84
+ height : '70%',*/
85
+ autoSize : true,
86
+ closeClick : false,
87
+ openEffect : 'none',
88
+ closeEffect : 'none',
89
+ nextClick : false,
90
+ arrows : false,
91
+ closeBtn : true
92
+ });
93
+ });
94
+ </script>
95
+ <?php endif; ?>
app/etc/modules/Retailon_Vzaar.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--/**
3
+ * This magento extension is created by RetailOn Inc for Vzaar.
4
+ * Visit us at http://www.retailon.net
5
+ * Author: Hashid Hameed
6
+ * Email: hashid@retailon.in
7
+ * Date: 25/2/14
8
+ * Time: 1:03 PM
9
+ *
10
+ * Please do not reproduce any part of the extension without prior permission.
11
+ */-->
12
+ <config>
13
+ <modules>
14
+ <Retailon_Vzaar>
15
+ <active>true</active>
16
+ <codePool>community</codePool>
17
+ </Retailon_Vzaar>
18
+ </modules>
19
+ </config>
js/vzaar/blank.gif ADDED
Binary file
js/vzaar/fancybox_loading.gif ADDED
Binary file
js/vzaar/fancybox_loading@2x.gif ADDED
Binary file
js/vzaar/fancybox_overlay.png ADDED
Binary file
js/vzaar/fancybox_sprite.png ADDED
Binary file
js/vzaar/fancybox_sprite@2x.png ADDED
Binary file
js/vzaar/jquery.fancybox.css ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
2
+ .fancybox-wrap,
3
+ .fancybox-skin,
4
+ .fancybox-outer,
5
+ .fancybox-inner,
6
+ .fancybox-image,
7
+ .fancybox-wrap iframe,
8
+ .fancybox-wrap object,
9
+ .fancybox-nav,
10
+ .fancybox-nav span,
11
+ .fancybox-tmp
12
+ {
13
+ padding: 0;
14
+ margin: 0;
15
+ border: 0;
16
+ outline: none;
17
+ vertical-align: top;
18
+ }
19
+
20
+ .fancybox-wrap {
21
+ position: absolute;
22
+ top: 0;
23
+ left: 0;
24
+ z-index: 8020;
25
+ }
26
+
27
+ .fancybox-skin {
28
+ position: relative;
29
+ background: #f9f9f9;
30
+ color: #444;
31
+ text-shadow: none;
32
+ -webkit-border-radius: 4px;
33
+ -moz-border-radius: 4px;
34
+ border-radius: 4px;
35
+ }
36
+
37
+ .fancybox-opened {
38
+ z-index: 8030;
39
+ }
40
+
41
+ .fancybox-opened .fancybox-skin {
42
+ -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
43
+ -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
44
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
45
+ }
46
+
47
+ .fancybox-outer, .fancybox-inner {
48
+ position: relative;
49
+ }
50
+
51
+ .fancybox-inner {
52
+ overflow: hidden;
53
+ }
54
+
55
+ .fancybox-type-iframe .fancybox-inner {
56
+ -webkit-overflow-scrolling: touch;
57
+ }
58
+
59
+ .fancybox-error {
60
+ color: #444;
61
+ font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
62
+ margin: 0;
63
+ padding: 15px;
64
+ white-space: nowrap;
65
+ }
66
+
67
+ .fancybox-image, .fancybox-iframe {
68
+ display: block;
69
+ width: 100%;
70
+ height: 100%;
71
+ }
72
+
73
+ .fancybox-image {
74
+ max-width: 100%;
75
+ max-height: 100%;
76
+ }
77
+
78
+ #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
79
+ background-image: url('fancybox_sprite.png');
80
+ }
81
+
82
+ #fancybox-loading {
83
+ position: fixed;
84
+ top: 50%;
85
+ left: 50%;
86
+ margin-top: -22px;
87
+ margin-left: -22px;
88
+ background-position: 0 -108px;
89
+ opacity: 0.8;
90
+ cursor: pointer;
91
+ z-index: 8060;
92
+ }
93
+
94
+ #fancybox-loading div {
95
+ width: 44px;
96
+ height: 44px;
97
+ background: url('fancybox_loading.gif') center center no-repeat;
98
+ }
99
+
100
+ .fancybox-close {
101
+ position: absolute;
102
+ top: -18px;
103
+ right: -18px;
104
+ width: 36px;
105
+ height: 36px;
106
+ cursor: pointer;
107
+ z-index: 8040;
108
+ }
109
+
110
+ .fancybox-nav {
111
+ position: absolute;
112
+ top: 0;
113
+ width: 40%;
114
+ height: 100%;
115
+ cursor: pointer;
116
+ text-decoration: none;
117
+ background: transparent url('blank.gif'); /* helps IE */
118
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
119
+ z-index: 8040;
120
+ }
121
+
122
+ .fancybox-prev {
123
+ left: 0;
124
+ }
125
+
126
+ .fancybox-next {
127
+ right: 0;
128
+ }
129
+
130
+ .fancybox-nav span {
131
+ position: absolute;
132
+ top: 50%;
133
+ width: 36px;
134
+ height: 34px;
135
+ margin-top: -18px;
136
+ cursor: pointer;
137
+ z-index: 8040;
138
+ visibility: hidden;
139
+ }
140
+
141
+ .fancybox-prev span {
142
+ left: 10px;
143
+ background-position: 0 -36px;
144
+ }
145
+
146
+ .fancybox-next span {
147
+ right: 10px;
148
+ background-position: 0 -72px;
149
+ }
150
+
151
+ .fancybox-nav:hover span {
152
+ visibility: visible;
153
+ }
154
+
155
+ .fancybox-tmp {
156
+ position: absolute;
157
+ top: -99999px;
158
+ left: -99999px;
159
+ visibility: hidden;
160
+ max-width: 99999px;
161
+ max-height: 99999px;
162
+ overflow: visible !important;
163
+ }
164
+
165
+ /* Overlay helper */
166
+
167
+ .fancybox-lock {
168
+ overflow: hidden !important;
169
+ width: auto;
170
+ }
171
+
172
+ .fancybox-lock body {
173
+ overflow: hidden !important;
174
+ }
175
+
176
+ .fancybox-lock-test {
177
+ overflow-y: hidden !important;
178
+ }
179
+
180
+ .fancybox-overlay {
181
+ position: absolute;
182
+ top: 0;
183
+ left: 0;
184
+ overflow: hidden;
185
+ display: none;
186
+ z-index: 8010;
187
+ background: url('fancybox_overlay.png');
188
+ }
189
+
190
+ .fancybox-overlay-fixed {
191
+ position: fixed;
192
+ bottom: 0;
193
+ right: 0;
194
+ }
195
+
196
+ .fancybox-lock .fancybox-overlay {
197
+ overflow: auto;
198
+ overflow-y: scroll;
199
+ }
200
+
201
+ /* Title helper */
202
+
203
+ .fancybox-title {
204
+ visibility: hidden;
205
+ font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
206
+ position: relative;
207
+ text-shadow: none;
208
+ z-index: 8050;
209
+ }
210
+
211
+ .fancybox-opened .fancybox-title {
212
+ visibility: visible;
213
+ }
214
+
215
+ .fancybox-title-float-wrap {
216
+ position: absolute;
217
+ bottom: 0;
218
+ right: 50%;
219
+ margin-bottom: -35px;
220
+ z-index: 8050;
221
+ text-align: center;
222
+ }
223
+
224
+ .fancybox-title-float-wrap .child {
225
+ display: inline-block;
226
+ margin-right: -100%;
227
+ padding: 2px 20px;
228
+ background: transparent; /* Fallback for web browsers that doesn't support RGBa */
229
+ background: rgba(0, 0, 0, 0.8);
230
+ -webkit-border-radius: 15px;
231
+ -moz-border-radius: 15px;
232
+ border-radius: 15px;
233
+ text-shadow: 0 1px 2px #222;
234
+ color: #FFF;
235
+ font-weight: bold;
236
+ line-height: 24px;
237
+ white-space: nowrap;
238
+ }
239
+
240
+ .fancybox-title-outside-wrap {
241
+ position: relative;
242
+ margin-top: 10px;
243
+ color: #fff;
244
+ }
245
+
246
+ .fancybox-title-inside-wrap {
247
+ padding-top: 10px;
248
+ }
249
+
250
+ .fancybox-title-over-wrap {
251
+ position: absolute;
252
+ bottom: 0;
253
+ left: 0;
254
+ color: #fff;
255
+ padding: 10px;
256
+ background: #000;
257
+ background: rgba(0, 0, 0, .8);
258
+ }
259
+
260
+ /*Retina graphics!*/
261
+ @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
262
+ only screen and (min--moz-device-pixel-ratio: 1.5),
263
+ only screen and (min-device-pixel-ratio: 1.5){
264
+
265
+ #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
266
+ background-image: url('fancybox_sprite@2x.png');
267
+ background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
268
+ }
269
+
270
+ #fancybox-loading div {
271
+ background-image: url('fancybox_loading@2x.gif');
272
+ background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
273
+ }
274
+ }
js/vzaar/jquery.fancybox.pack.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
2
+ (function(r,G,f,v){var J=f("html"),n=f(r),p=f(G),b=f.fancybox=function(){b.open.apply(this,arguments)},I=navigator.userAgent.match(/msie/i),B=null,s=G.createTouch!==v,t=function(a){return a&&a.hasOwnProperty&&a instanceof f},q=function(a){return a&&"string"===f.type(a)},E=function(a){return q(a)&&0<a.indexOf("%")},l=function(a,d){var e=parseInt(a,10)||0;d&&E(a)&&(e*=b.getViewport()[d]/100);return Math.ceil(e)},w=function(a,b){return l(a,b)+"px"};f.extend(b,{version:"2.1.5",defaults:{padding:15,margin:20,
3
+ width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,pixelRatio:1,autoSize:!0,autoHeight:!1,autoWidth:!1,autoResize:!0,autoCenter:!s,fitToView:!0,aspectRatio:!1,topRatio:0.5,leftRatio:0.5,scrolling:"auto",wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},iframe:{scrolling:"auto",preload:!0},swf:{wmode:"transparent",allowfullscreen:"true",allowscriptaccess:"always"},
4
+ keys:{next:{13:"left",34:"up",39:"left",40:"up"},prev:{8:"right",33:"down",37:"right",38:"down"},close:[27],play:[32],toggle:[70]},direction:{next:"left",prev:"right"},scrollOutside:!0,index:0,type:null,href:null,content:null,title:null,tpl:{wrap:'<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen'+
5
+ (I?' allowtransparency="true"':"")+"></iframe>",error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',closeBtn:'<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',next:'<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
6
+ openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
7
+ isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=t(a)?f(a).get():[a]),f.each(a,function(e,c){var k={},g,h,j,m,l;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),t(c)?(k={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0,k,
8
+ c.metadata())):k=c);g=d.href||k.href||(q(c)?c:null);h=d.title!==v?d.title:k.title||"";m=(j=d.content||k.content)?"html":d.type||k.type;!m&&k.isDom&&(m=c.data("fancybox-type"),m||(m=(m=c.prop("class").match(/fancybox\.(\w+)/))?m[1]:null));q(g)&&(m||(b.isImage(g)?m="image":b.isSWF(g)?m="swf":"#"===g.charAt(0)?m="inline":q(c)&&(m="html",j=c)),"ajax"===m&&(l=g.split(/\s+/,2),g=l.shift(),l=l.shift()));j||("inline"===m?g?j=f(q(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):k.isDom&&(j=c):"html"===m?j=g:!m&&(!g&&
9
+ k.isDom)&&(m="inline",j=c));f.extend(k,{href:g,type:m,content:j,title:h,selector:l});a[e]=k}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==v&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current||
10
+ b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer=
11
+ setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index<b.group.length-1))b.player.isActive=!0,p.bind({"onCancel.player beforeClose.player":c,"onUpdate.player":e,"beforeLoad.player":d}),e(),b.trigger("onPlayStart")}else c()},next:function(a){var d=b.current;d&&(q(a)||(a=d.direction.next),b.jumpto(d.index+1,a,"next"))},prev:function(a){var d=b.current;
12
+ d&&(q(a)||(a=d.direction.prev),b.jumpto(d.index-1,a,"prev"))},jumpto:function(a,d,e){var c=b.current;c&&(a=l(a),b.direction=d||c.direction[a>=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==v&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,k;c&&(k=b._getPosition(d),a&&"scroll"===a.type?(delete k.position,c.stop(!0,!0).animate(k,200)):(c.css(k),e.pos=f.extend({},e.dim,k)))},update:function(a){var d=
13
+ a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(B),B=null);b.isOpen&&!B&&(B=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),B=null)},e&&!s?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,s&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),b.trigger("onUpdate")),
14
+ b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('<div id="fancybox-loading"><div></div></div>').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked||!1,d={x:n.scrollLeft(),
15
+ y:n.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=s&&r.innerWidth?r.innerWidth:n.width(),d.h=s&&r.innerHeight?r.innerHeight:n.height());return d},unbindEvents:function(){b.wrap&&t(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");n.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(n.bind("orientationchange.fb"+(s?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=e.which||e.keyCode,k=e.target||e.srcElement;
16
+ if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!k||!k.type&&!f(k).is("[contenteditable]")))&&f.each(d,function(d,k){if(1<a.group.length&&k[c]!==v)return b[d](k[c]),e.preventDefault(),!1;if(-1<f.inArray(c,k))return b[d](),e.preventDefault(),!1})}),f.fn.mousewheel&&a.mouseWheel&&b.wrap.bind("mousewheel.fb",function(d,c,k,g){for(var h=f(d.target||null),j=!1;h.length&&!j&&!h.is(".fancybox-skin")&&!h.is(".fancybox-wrap");)j=h[0]&&!(h[0].style.overflow&&"hidden"===h[0].style.overflow)&&
17
+ (h[0].clientWidth&&h[0].scrollWidth>h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!j&&1<b.group.length&&!a.canShrink){if(0<g||0<k)b.prev(0<g?"down":"left");else if(0>g||0>k)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,
18
+ {},b.helpers[d].defaults,e),c)});p.trigger(a)}},isImage:function(a){return q(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return q(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=l(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,
19
+ mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=
20
+ !0);"iframe"===c&&s&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(s?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,w(d.padding[a]))});b.trigger("onReady");if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");
21
+ "image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=
22
+ this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",s?"auto":a.iframe.scrolling).attr("src",a.href);
23
+ f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);s||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,
24
+ e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,k,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents();e=a.content;c=a.type;k=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,
25
+ outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("<div>").html(e).find(a.selector):t(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('<div class="fancybox-placeholder"></div>').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",!1)}));break;case "image":e=a.tpl.image.replace("{href}",
26
+ g);break;case "swf":e='<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="'+g+'"></param>',h="",f.each(a.swf,function(a,b){e+='<param name="'+a+'" value="'+b+'"></param>';h+=" "+a+'="'+b+'"'}),e+='<embed src="'+g+'" type="application/x-shockwave-flash" width="100%" height="100%"'+h+"></embed></object>"}(!t(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow");a.inner.css("overflow","yes"===k?"scroll":
27
+ "no"===k?"hidden":k);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,k=b.skin,g=b.inner,h=b.current,c=h.width,j=h.height,m=h.minWidth,u=h.minHeight,n=h.maxWidth,p=h.maxHeight,s=h.scrolling,q=h.scrollOutside?
28
+ h.scrollbarWidth:0,x=h.margin,y=l(x[1]+x[3]),r=l(x[0]+x[2]),v,z,t,C,A,F,B,D,H;e.add(k).add(g).width("auto").height("auto").removeClass("fancybox-tmp");x=l(k.outerWidth(!0)-k.width());v=l(k.outerHeight(!0)-k.height());z=y+x;t=r+v;C=E(c)?(a.w-z)*l(c)/100:c;A=E(j)?(a.h-t)*l(j)/100:j;if("iframe"===h.type){if(H=h.content,h.autoHeight&&1===H.data("ready"))try{H[0].contentWindow.document.location&&(g.width(C).height(9999),F=H.contents().find("body"),q&&F.css("overflow-x","hidden"),A=F.outerHeight(!0))}catch(G){}}else if(h.autoWidth||
29
+ h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=l(C);j=l(A);D=C/A;m=l(E(m)?l(m,"w")-z:m);n=l(E(n)?l(n,"w")-z:n);u=l(E(u)?l(u,"h")-t:u);p=l(E(p)?l(p,"h")-t:p);F=n;B=p;h.fitToView&&(n=Math.min(a.w-z,n),p=Math.min(a.h-t,p));z=a.w-y;r=a.h-r;h.aspectRatio?(c>n&&(c=n,j=l(c/D)),j>p&&(j=p,c=l(j*D)),c<m&&(c=m,j=l(c/D)),j<u&&(j=u,c=l(j*D))):(c=Math.max(m,Math.min(c,n)),h.autoHeight&&
30
+ "iframe"!==h.type&&(g.width(c),j=g.height()),j=Math.max(u,Math.min(j,p)));if(h.fitToView)if(g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height(),h.aspectRatio)for(;(a>z||y>r)&&(c>m&&j>u)&&!(19<d++);)j=Math.max(u,Math.min(p,j-10)),c=l(j*D),c<m&&(c=m,j=l(c/D)),c>n&&(c=n,j=l(c/D)),g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height();else c=Math.max(m,Math.min(c,c-(a-z))),j=Math.max(u,Math.min(j,j-(y-r)));q&&("auto"===s&&j<A&&c+x+q<z)&&(c+=q);g.width(c).height(j);e.width(c+x);a=e.width();
31
+ y=e.height();e=(a>z||y>r)&&c>m&&j>u;c=h.aspectRatio?c<F&&j<B&&c<C&&j<A:(c<F||j<B)&&(c<C||j<A);f.extend(h,{dim:{width:w(a),height:w(y)},origWidth:C,origHeight:A,canShrink:e,canExpand:c,wPadding:x,hPadding:v,wrapSpace:y-k.outerHeight(!0),skinSpace:k.height()-j});!H&&(h.autoHeight&&j>u&&j<p&&!c)&&g.height("auto")},_getPosition:function(a){var d=b.current,e=b.getViewport(),c=d.margin,f=b.wrap.width()+c[1]+c[3],g=b.wrap.height()+c[0]+c[2],c={position:"absolute",top:c[0],left:c[3]};d.autoCenter&&d.fixed&&
32
+ !a&&g<=e.h&&f<=e.w?c.position="fixed":d.locked||(c.top+=e.y,c.left+=e.x);c.top=w(Math.max(c.top,c.top+(e.h-g)*d.topRatio));c.left=w(Math.max(c.left,c.left+(e.w-f)*d.leftRatio));return c},_afterZoomIn:function(){var a=b.current;a&&(b.isOpen=b.isOpened=!0,b.wrap.css("overflow","visible").addClass("fancybox-opened"),b.update(),(a.closeClick||a.nextClick&&1<b.group.length)&&b.inner.css("cursor","pointer").bind("click.fb",function(d){!f(d.target).is("a")&&!f(d.target).parent().is("a")&&(d.preventDefault(),
33
+ b[a.closeClick?"close":"next"]())}),a.closeBtn&&f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb",function(a){a.preventDefault();b.close()}),a.arrows&&1<b.group.length&&((a.loop||0<a.index)&&f(a.tpl.prev).appendTo(b.outer).bind("click.fb",b.prev),(a.loop||a.index<b.group.length-1)&&f(a.tpl.next).appendTo(b.outer).bind("click.fb",b.next)),b.trigger("afterShow"),!a.loop&&a.index===a.group.length-1?b.play(!1):b.opts.autoPlay&&!b.player.isActive&&(b.opts.autoPlay=!1,b.play()))},_afterZoomOut:function(a){a=
34
+ a||b.current;f(".fancybox-wrap").trigger("onReset").remove();f.extend(b,{group:{},opts:{},router:!1,current:null,isActive:!1,isOpened:!1,isOpen:!1,isClosing:!1,wrap:null,skin:null,outer:null,inner:null});b.trigger("afterClose",a)}});b.transitions={getOrigPosition:function(){var a=b.current,d=a.element,e=a.orig,c={},f=50,g=50,h=a.hPadding,j=a.wPadding,m=b.getViewport();!e&&(a.isDom&&d.is(":visible"))&&(e=d.find("img:first"),e.length||(e=d));t(e)?(c=e.offset(),e.is("img")&&(f=e.outerWidth(),g=e.outerHeight())):
35
+ (c.top=m.y+(m.h-g)*a.topRatio,c.left=m.x+(m.w-f)*a.leftRatio);if("fixed"===b.wrap.css("position")||a.locked)c.top-=m.y,c.left-=m.x;return c={top:w(c.top-h*a.topRatio),left:w(c.left-j*a.leftRatio),width:w(f+j),height:w(g+h)}},step:function(a,d){var e,c,f=d.prop;c=b.current;var g=c.wrapSpace,h=c.skinSpace;if("width"===f||"height"===f)e=d.end===d.start?1:(a-d.start)/(d.end-d.start),b.isClosing&&(e=1-e),c="width"===f?c.wPadding:c.hPadding,c=a-c,b.skin[f](l("width"===f?c:c-g*e)),b.inner[f](l("width"===
36
+ f?c:c-g*e-h*e))},zoomIn:function(){var a=b.current,d=a.pos,e=a.openEffect,c="elastic"===e,k=f.extend({opacity:1},d);delete k.position;c?(d=this.getOrigPosition(),a.openOpacity&&(d.opacity=0.1)):"fade"===e&&(d.opacity=0.1);b.wrap.css(d).animate(k,{duration:"none"===e?0:a.openSpeed,easing:a.openEasing,step:c?this.step:null,complete:b._afterZoomIn})},zoomOut:function(){var a=b.current,d=a.closeEffect,e="elastic"===d,c={opacity:0.1};e&&(c=this.getOrigPosition(),a.closeOpacity&&(c.opacity=0.1));b.wrap.animate(c,
37
+ {duration:"none"===d?0:a.closeSpeed,easing:a.closeEasing,step:e?this.step:null,complete:b._afterZoomOut})},changeIn:function(){var a=b.current,d=a.nextEffect,e=a.pos,c={opacity:1},f=b.direction,g;e.opacity=0.1;"elastic"===d&&(g="down"===f||"up"===f?"top":"left","down"===f||"right"===f?(e[g]=w(l(e[g])-200),c[g]="+=200px"):(e[g]=w(l(e[g])+200),c[g]="-=200px"));"none"===d?b._afterZoomIn():b.wrap.css(e).animate(c,{duration:a.nextSpeed,easing:a.nextEasing,complete:b._afterZoomIn})},changeOut:function(){var a=
38
+ b.previous,d=a.prevEffect,e={opacity:0.1},c=b.direction;"elastic"===d&&(e["down"===c||"up"===c?"top":"left"]=("up"===c||"left"===c?"-":"+")+"=200px");a.wrap.animate(e,{duration:"none"===d?0:a.prevSpeed,easing:a.prevEasing,complete:function(){f(this).trigger("onReset").remove()}})}};b.helpers.overlay={defaults:{closeClick:!0,speedOut:200,showEarly:!0,css:{},locked:!s,fixed:!0},overlay:null,fixed:!1,el:f("html"),create:function(a){a=f.extend({},this.defaults,a);this.overlay&&this.close();this.overlay=
39
+ f('<div class="fancybox-overlay"></div>').appendTo(b.coming?b.coming.parent:a.parent);this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(n.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?
40
+ b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){var a,b;n.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),a=n.scrollTop(),b=n.scrollLeft(),this.el.removeClass("fancybox-lock"),n.scrollTop(a).scrollLeft(b));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");I?(b=Math.max(G.documentElement.offsetWidth,G.body.offsetWidth),
41
+ p.width()>b&&(a=p.width())):p.width()>n.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&(this.fixed&&b.fixed)&&(e||(this.margin=p.height()>n.height()?f("html").css("margin-right").replace("px",""):!1),b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){var e,c;b.locked&&(!1!==this.margin&&(f("*").filter(function(){return"fixed"===
42
+ f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin")),e=n.scrollTop(),c=n.scrollLeft(),this.el.addClass("fancybox-lock"),n.scrollTop(e).scrollLeft(c));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=
43
+ b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(q(e)&&""!==f.trim(e)){d=f('<div class="fancybox-title fancybox-title-'+c+'-wrap">'+e+"</div>");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),I&&d.width(d.width()),d.wrapInner('<span class="child"></span>'),b.current.margin[2]+=Math.abs(l(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,
44
+ e=f(this),c=this.selector||"",k=function(g){var h=f(this).blur(),j=d,k,l;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(k=a.groupAttr||"data-fancybox-group",l=h.attr(k),l||(k="rel",l=h.get(0)[k]),l&&(""!==l&&"nofollow"!==l)&&(h=c.length?f(c):e,h=h.filter("["+k+'="'+l+'"]'),j=h.index(this)),a.index=j,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",k):p.undelegate(c,"click.fb-start").delegate(c+
45
+ ":not('.fancybox-item, .fancybox-nav')","click.fb-start",k);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===v&&(f.scrollbarWidth=function(){var a=f('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===v){a=f.support;d=f('<div style="position:fixed;top:20px;"></div>').appendTo("body");var e=20===
46
+ d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(r).width();J.addClass("fancybox-lock-test");d=f(r).width();J.removeClass("fancybox-lock-test");f("<style type='text/css'>.fancybox-margin{margin-right:"+(d-a)+"px;}</style>").appendTo("head")})})(window,document,jQuery);
js/vzaar/jquery.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
2
+ //@ sourceMappingURL=jquery-1.10.2.min.map
3
+ */
4
+ (function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
5
+ }({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
6
+ u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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 contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
7
+ jQuery.noConflict();
js/vzaar/vzaar.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var jq = jQuery.noConflict();
2
+ jq(document).ready(function() {
3
+ jq(".vzaar").fancybox({
4
+ nextClick : false,
5
+ maxWidth : 800,
6
+ maxHeight : 600,
7
+ fitToView : false,
8
+ width : '70%',
9
+ height : '70%',
10
+ autoSize : false,
11
+ closeClick : false,
12
+ openEffect : 'none',
13
+ closeEffect : 'none',
14
+ arrows : false,
15
+ closeBtn : true,
16
+ type: 'iframe',
17
+ });
18
+ });
lib/Vzaar/AccountType.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ Class CostType {
4
+ var $currency;
5
+ var $monthly;
6
+ /**
7
+ *
8
+ * @param <string> $currency
9
+ * @param <integer> $monthly
10
+ */
11
+ public function CostType($currency, $monthly) {
12
+ $this->currency = $currency;
13
+ $this->monthly = $monthly;
14
+ }
15
+ }
16
+
17
+ Class RightsType {
18
+ var $borderless;
19
+ var $searchEnhancer;
20
+ public function RightsType($borderless, $searchEnhancer) {
21
+ $this->borderless = $borderless;
22
+ $this->searchEnhancer = $searchEnhancer;
23
+ }
24
+ }
25
+
26
+ class AccountType {
27
+ var $version;
28
+ var $accountId;
29
+ var $title;
30
+ var $cost;
31
+ var $bandwidth;
32
+ var $rights;
33
+
34
+ ///////////////////////////////////////////////////////////////////////////
35
+
36
+ /**
37
+ * Package protected constructor.
38
+ *
39
+ * @param version the vzaar API version number
40
+ * @param accountId the vzaar account ID
41
+ * @param title the name of the vzaar account
42
+ * @param monthly the monthly cost of the account in the given currency
43
+ * @param currency the currency the account is charged in. Currently this
44
+ * is only in dollars
45
+ * @param bandwidth the amount of monthly bandwidth allocated to a user
46
+ * for video service and playing
47
+ * @param borderless if the user is allowed to use a player with no skin
48
+ * @param searchEnhancer if the user is allowed to optimize where google
49
+ * directs video traffic
50
+ */
51
+ public function AccountType($version, $accountId, $title, $monthly, $currency, $bandwidth, $borderless, $searchEnhancer) {
52
+ $this->version = $version;
53
+ $this->accountId = $accountId;
54
+ $this->title = $title;
55
+ $this->cost = new CostType($currency, $monthly);
56
+
57
+ $this->rights = new RightsType($borderless, $searchEnhancer);
58
+ $this->bandwidth = $bandwidth;
59
+ }
60
+
61
+ static function fromJson($data) {
62
+ $jo = json_decode($data);
63
+ if ($jo==NULL) {
64
+ return NULL;
65
+ }
66
+ else {
67
+ //$version, $accountId, $title, $monthly, $currency, $bandwidth, $borderless, $searchEnhancer
68
+ $acc = new AccountType($jo->version, $jo->account_id, $jo->title, $jo->cost->monthly, $jo->cost->currency, $jo->bandwidth, $jo->rights->borderless, $jo->rights->searchEnhancer);
69
+ return $acc;
70
+ }
71
+ }
72
+ }
73
+
74
+ ?>
lib/Vzaar/HttpRequest1.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * HttpRequest
5
+ *
6
+ * @author Skitsanos
7
+ */
8
+ //application/x-www-form-urlencoded
9
+ //application/json
10
+ //text/xml
11
+
12
+ class HttpRequest1 {
13
+
14
+ protected $c;
15
+ protected $url;
16
+ var $method = "GET";
17
+ var $preventCaching = true;
18
+ var $useSsl = true;
19
+ var $headers = array();
20
+ var $verbose = false;
21
+ var $uploadMode = false;
22
+
23
+ function __construct($url) {
24
+ if (!function_exists('curl_init')) {
25
+ echo "Function curl_init, used by HttpRequest does not exist.\n";
26
+ }
27
+ $this->url = $url;
28
+ $this->c = curl_init($this->url);
29
+ }
30
+
31
+ function send($data=null, $filepath=null) {
32
+ if (count($this->headers) > 0) {
33
+ curl_setopt($this->c, CURLOPT_HEADER, false);
34
+ curl_setopt($this->c, CURLOPT_HTTPHEADER, $this->headers);
35
+ }
36
+
37
+ curl_setopt($this->c, CURLOPT_RETURNTRANSFER, true);
38
+ curl_setopt($this->c, CURLOPT_FOLLOWLOCATION, true);
39
+
40
+ if ($this->useSsl) {
41
+ curl_setopt($this->c, CURLOPT_SSL_VERIFYPEER, 0);
42
+ curl_setopt($this->c, CURLOPT_SSL_VERIFYHOST, 0);
43
+ }
44
+
45
+ if ($this->preventCaching) {
46
+ curl_setopt($this->c, CURLOPT_FORBID_REUSE, true);
47
+ curl_setopt($this->c, CURLOPT_FRESH_CONNECT, true);
48
+ }
49
+
50
+ if ($this->uploadMode) {
51
+ //curl_setopt($this->c, CURLOPT_URL, $filepath);
52
+ //curl_setopt($this->c, CURLOPT_UPLOAD, true);
53
+ curl_setopt($this->c, CURLOPT_POST, true);
54
+ $fp = fopen($filepath, 'r');
55
+ curl_setopt($this->c, CURLOPT_INFILE, $fp);
56
+ curl_setopt($this->c, CURLOPT_INFILESIZE, filesize($filepath));
57
+ }
58
+
59
+ switch (strtoupper($this->method)) {
60
+ case 'POST':
61
+ curl_setopt($this->c, CURLOPT_POST, true);
62
+ if ($data != null)
63
+ curl_setopt($this->c, CURLOPT_POSTFIELDS, $data);
64
+ break;
65
+
66
+ case 'HEAD':
67
+ curl_setopt($this->c, CURLOPT_NOBODY, true);
68
+ break;
69
+
70
+ case 'DELETE':
71
+ curl_setopt($this->c, CURLOPT_CUSTOMREQUEST, "DELETE");
72
+ break;
73
+
74
+ case 'PUT':
75
+ curl_setopt($this->c, CURLOPT_PUT, true);
76
+ if ($data != null)
77
+ curl_setopt($this->c, CURLOPT_POSTFIELDS, $data);
78
+ break;
79
+ }
80
+
81
+ curl_setopt($this->c, CURLOPT_VERBOSE, $this->verbose);
82
+
83
+ $output = curl_exec($this->c);
84
+
85
+ curl_close($this->c);
86
+ return $output;
87
+ }
88
+
89
+ }
90
+ ?>
lib/Vzaar/OAuth.php ADDED
@@ -0,0 +1,797 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // vim: foldmethod=marker
3
+
4
+ /* Generic exception class
5
+ */
6
+ class OAuthException extends Exception {
7
+ // pass
8
+ }
9
+
10
+ class OAuthConsumer {
11
+ public $key;
12
+ public $secret;
13
+
14
+ function __construct($key, $secret, $callback_url=NULL) {
15
+ $this->key = $key;
16
+ $this->secret = $secret;
17
+ $this->callback_url = $callback_url;
18
+ }
19
+
20
+ function __toString() {
21
+ return "OAuthConsumer[key=$this->key,secret=$this->secret]";
22
+ }
23
+ }
24
+
25
+ class OAuthToken {
26
+ // access tokens and request tokens
27
+ public $key;
28
+ public $secret;
29
+
30
+ /**
31
+ * key = the token
32
+ * secret = the token secret
33
+ */
34
+ function __construct($key, $secret) {
35
+ $this->key = $key;
36
+ $this->secret = $secret;
37
+ }
38
+
39
+ /**
40
+ * generates the basic string serialization of a token that a server
41
+ * would respond to request_token and access_token calls with
42
+ */
43
+ function to_string() {
44
+ return "oauth_token=" .
45
+ OAuthUtil::urlencode_rfc3986($this->key) .
46
+ "&oauth_token_secret=" .
47
+ OAuthUtil::urlencode_rfc3986($this->secret);
48
+ }
49
+
50
+ function __toString() {
51
+ return $this->to_string();
52
+ }
53
+ }
54
+
55
+ class OAuthSignatureMethod {
56
+ public function check_signature(&$request, $consumer, $token, $signature) {
57
+ $built = $this->build_signature($request, $consumer, $token);
58
+ return $built == $signature;
59
+ }
60
+ }
61
+
62
+ class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
63
+ function get_name() {
64
+ return "HMAC-SHA1";
65
+ }
66
+
67
+ public function build_signature($request, $consumer, $token) {
68
+ $base_string = $request->get_signature_base_string();
69
+
70
+ $request->base_string = $base_string;
71
+
72
+
73
+
74
+ $key_parts = array(
75
+ $consumer->secret,
76
+ ($token) ? $token->secret : ""
77
+ );
78
+
79
+ $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
80
+ $key = implode('&', $key_parts);
81
+
82
+ return base64_encode(hash_hmac('sha1', $base_string, $key, true));
83
+ }
84
+ }
85
+
86
+ class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
87
+ public function get_name() {
88
+ return "PLAINTEXT";
89
+ }
90
+
91
+ public function build_signature($request, $consumer, $token) {
92
+ $sig = array(
93
+ OAuthUtil::urlencode_rfc3986($consumer->secret)
94
+ );
95
+
96
+ if ($token) {
97
+ array_push($sig, OAuthUtil::urlencode_rfc3986($token->secret));
98
+ } else {
99
+ array_push($sig, '');
100
+ }
101
+
102
+ $raw = implode("&", $sig);
103
+ // for debug purposes
104
+ $request->base_string = $raw;
105
+
106
+ return OAuthUtil::urlencode_rfc3986($raw);
107
+ }
108
+ }
109
+
110
+ class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
111
+ public function get_name() {
112
+ return "RSA-SHA1";
113
+ }
114
+
115
+ protected function fetch_public_cert(&$request) {
116
+ // not implemented yet, ideas are:
117
+ // (1) do a lookup in a table of trusted certs keyed off of consumer
118
+ // (2) fetch via http using a url provided by the requester
119
+ // (3) some sort of specific discovery code based on request
120
+ //
121
+ // either way should return a string representation of the certificate
122
+ throw Exception("fetch_public_cert not implemented");
123
+ }
124
+
125
+ protected function fetch_private_cert(&$request) {
126
+ // not implemented yet, ideas are:
127
+ // (1) do a lookup in a table of trusted certs keyed off of consumer
128
+ //
129
+ // either way should return a string representation of the certificate
130
+ throw Exception("fetch_private_cert not implemented");
131
+ }
132
+
133
+ public function build_signature(&$request, $consumer, $token) {
134
+ $base_string = $request->get_signature_base_string();
135
+ $request->base_string = $base_string;
136
+
137
+ // Fetch the private key cert based on the request
138
+ $cert = $this->fetch_private_cert($request);
139
+
140
+ // Pull the private key ID from the certificate
141
+ $privatekeyid = openssl_get_privatekey($cert);
142
+
143
+ // Sign using the key
144
+ $ok = openssl_sign($base_string, $signature, $privatekeyid);
145
+
146
+ // Release the key resource
147
+ openssl_free_key($privatekeyid);
148
+
149
+ return base64_encode($signature);
150
+ }
151
+
152
+ public function check_signature(&$request, $consumer, $token, $signature) {
153
+ $decoded_sig = base64_decode($signature);
154
+
155
+ $base_string = $request->get_signature_base_string();
156
+
157
+ // Fetch the public key cert based on the request
158
+ $cert = $this->fetch_public_cert($request);
159
+
160
+ // Pull the public key ID from the certificate
161
+ $publickeyid = openssl_get_publickey($cert);
162
+
163
+ // Check the computed signature against the one passed in the query
164
+ $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
165
+
166
+ // Release the key resource
167
+ openssl_free_key($publickeyid);
168
+
169
+ return $ok == 1;
170
+ }
171
+ }
172
+
173
+ class OAuthRequest {
174
+ private $parameters;
175
+ private $http_method;
176
+ private $http_url;
177
+ // for debug purposes
178
+ public $base_string;
179
+ public static $version = '1.0';
180
+ public static $POST_INPUT = 'php://input';
181
+
182
+ function __construct($http_method, $http_url, $parameters=NULL) {
183
+ @$parameters or $parameters = array();
184
+ $this->parameters = $parameters;
185
+ $this->http_method = $http_method;
186
+ $this->http_url = $http_url;
187
+ }
188
+
189
+
190
+ /**
191
+ * attempt to build up a request from what was passed to the server
192
+ */
193
+ public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
194
+ $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
195
+ ? 'http'
196
+ : 'https';
197
+ @$http_url or $http_url = $scheme .
198
+ '://' . $_SERVER['HTTP_HOST'] .
199
+ ':' .
200
+ $_SERVER['SERVER_PORT'] .
201
+ $_SERVER['REQUEST_URI'];
202
+ @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
203
+
204
+ // We weren't handed any parameters, so let's find the ones relevant to
205
+ // this request.
206
+ // If you run XML-RPC or similar you should use this to provide your own
207
+ // parsed parameter-list
208
+ if (!$parameters) {
209
+ // Find request headers
210
+ $request_headers = OAuthUtil::get_headers();
211
+
212
+ // Parse the query-string to find GET parameters
213
+ $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
214
+
215
+ // It's a POST request of the proper content-type, so parse POST
216
+ // parameters and add those overriding any duplicates from GET
217
+ if ($http_method == "POST"
218
+ && @strstr($request_headers["Content-Type"],
219
+ "application/x-www-form-urlencoded")
220
+ ) {
221
+ $post_data = OAuthUtil::parse_parameters(
222
+ file_get_contents(self::$POST_INPUT)
223
+ );
224
+ $parameters = array_merge($parameters, $post_data);
225
+ }
226
+
227
+ // We have a Authorization-header with OAuth data. Parse the header
228
+ // and add those overriding any duplicates from GET or POST
229
+ if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {
230
+ $header_parameters = OAuthUtil::split_header(
231
+ $request_headers['Authorization']
232
+ );
233
+ $parameters = array_merge($parameters, $header_parameters);
234
+ }
235
+
236
+ }
237
+
238
+ return new OAuthRequest($http_method, $http_url, $parameters);
239
+ }
240
+
241
+ /**
242
+ * pretty much a helper function to set up the request
243
+ */
244
+ public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
245
+ @$parameters or $parameters = array();
246
+ $defaults = array("oauth_version" => OAuthRequest::$version,
247
+ "oauth_nonce" => OAuthRequest::generate_nonce(),
248
+ "oauth_timestamp" => OAuthRequest::generate_timestamp(),
249
+ "oauth_consumer_key" => $consumer->key);
250
+ if ($token)
251
+ $defaults['oauth_token'] = $token->key;
252
+
253
+ $parameters = array_merge($defaults, $parameters);
254
+
255
+ return new OAuthRequest($http_method, $http_url, $parameters);
256
+ }
257
+
258
+ public function set_parameter($name, $value, $allow_duplicates = true) {
259
+ if ($allow_duplicates && isset($this->parameters[$name])) {
260
+ // We have already added parameter(s) with this name, so add to the list
261
+ if (is_scalar($this->parameters[$name])) {
262
+ // This is the first duplicate, so transform scalar (string)
263
+ // into an array so we can add the duplicates
264
+ $this->parameters[$name] = array($this->parameters[$name]);
265
+ }
266
+
267
+ $this->parameters[$name][] = $value;
268
+ } else {
269
+ $this->parameters[$name] = $value;
270
+ }
271
+ }
272
+
273
+ public function get_parameter($name) {
274
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
275
+ }
276
+
277
+ public function get_parameters() {
278
+ return $this->parameters;
279
+ }
280
+
281
+ public function unset_parameter($name) {
282
+ unset($this->parameters[$name]);
283
+ }
284
+
285
+ /**
286
+ * The request parameters, sorted and concatenated into a normalized string.
287
+ * @return string
288
+ */
289
+ public function get_signable_parameters() {
290
+ // Grab all parameters
291
+ $params = $this->parameters;
292
+
293
+ // Remove oauth_signature if present
294
+ // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
295
+ if (isset($params['oauth_signature'])) {
296
+ unset($params['oauth_signature']);
297
+ }
298
+
299
+ // get the query string and add it to params
300
+ // fast patch by Bratila B.
301
+ // known bug - doesen't handle multiple query strings!!! yet! --- solved 05.01.2010
302
+ $parts_2 = parse_url($this->http_url);
303
+ if (isset($parts_2['query']))
304
+ {
305
+ $toate=explode("&",$parts_2['query']);
306
+ foreach ($toate as $key=>$valoare)
307
+ {
308
+ $query=explode("=",$valoare);
309
+ $params[$query[0]]=$query[1];
310
+ }
311
+ }
312
+
313
+
314
+ return OAuthUtil::build_http_query($params);
315
+ }
316
+
317
+ /**
318
+ * Returns the base string of this request
319
+ *
320
+ * The base string defined as the method, the url
321
+ * and the parameters (normalized), each urlencoded
322
+ * and the concated with &.
323
+ */
324
+ public function get_signature_base_string() {
325
+
326
+ $parts = array(
327
+ $this->get_normalized_http_method(),
328
+ $this->get_normalized_http_url(),
329
+ $this->get_signable_parameters(),
330
+ );
331
+
332
+ $parts = OAuthUtil::urlencode_rfc3986($parts);
333
+
334
+ return implode('&', $parts);
335
+ }
336
+
337
+
338
+ /**
339
+ * just uppercases the http method
340
+ */
341
+ public function get_normalized_http_method() {
342
+ return strtoupper($this->http_method);
343
+ }
344
+
345
+ /**
346
+ * parses the url and rebuilds it to be
347
+ * scheme://host/path
348
+ */
349
+ public function get_normalized_http_url() {
350
+ $parts = parse_url($this->http_url);
351
+
352
+ $port = @$parts['port'];
353
+ $scheme = $parts['scheme'];
354
+ $host = $parts['host'];
355
+ $path = @$parts['path'];
356
+
357
+ $port or $port = ($scheme == 'https') ? '443' : '80';
358
+
359
+ if (($scheme == 'https' && $port != '443')
360
+ || ($scheme == 'http' && $port != '80')) {
361
+ $host = "$host:$port";
362
+ }
363
+ return "$scheme://$host$path";
364
+ }
365
+
366
+ /**
367
+ * builds a url usable for a GET request
368
+ */
369
+ public function to_url() {
370
+ $post_data = $this->to_postdata();
371
+ $out = $this->get_normalized_http_url();
372
+ if ($post_data) {
373
+ $out .= '?'.$post_data;
374
+ }
375
+ return $out;
376
+ }
377
+
378
+ /**
379
+ * builds the data one would send in a POST request
380
+ */
381
+ public function to_postdata() {
382
+ return OAuthUtil::build_http_query($this->parameters);
383
+ }
384
+
385
+ /**
386
+ * builds the Authorization: header
387
+ */
388
+ public function to_header() {
389
+ $out ='Authorization: OAuth realm=""';
390
+ $total = array();
391
+ foreach ($this->parameters as $k => $v) {
392
+ if (substr($k, 0, 5) != "oauth") continue;
393
+ if (is_array($v)) {
394
+ throw new OAuthException('Arrays not supported in headers');
395
+ }
396
+ $out .= ',' .
397
+ OAuthUtil::urlencode_rfc3986($k) .
398
+ '="' .
399
+ OAuthUtil::urlencode_rfc3986($v) .
400
+ '"';
401
+ }
402
+ return $out;
403
+ }
404
+
405
+ public function __toString() {
406
+ return $this->to_url();
407
+ }
408
+
409
+
410
+ public function sign_request($signature_method, $consumer, $token) {
411
+ $this->set_parameter(
412
+ "oauth_signature_method",
413
+ $signature_method->get_name(),
414
+ false
415
+ );
416
+ $signature = $this->build_signature($signature_method, $consumer, $token);
417
+ $this->set_parameter("oauth_signature", $signature, false);
418
+ }
419
+
420
+ public function build_signature($signature_method, $consumer, $token) {
421
+ $signature = $signature_method->build_signature($this, $consumer, $token);
422
+ return $signature;
423
+ }
424
+
425
+ /**
426
+ * util function: current timestamp
427
+ */
428
+ private static function generate_timestamp() {
429
+ return time();
430
+ }
431
+
432
+ /**
433
+ * util function: current nonce
434
+ */
435
+ private static function generate_nonce() {
436
+ $mt = microtime();
437
+ $rand = mt_rand();
438
+
439
+ return md5($mt . $rand); // md5s look nicer than numbers
440
+ }
441
+ }
442
+
443
+ class OAuthServer {
444
+ protected $timestamp_threshold = 300; // in seconds, five minutes
445
+ protected $version = 1.0; // hi blaine
446
+ protected $signature_methods = array();
447
+
448
+ protected $data_store;
449
+
450
+ function __construct($data_store) {
451
+ $this->data_store = $data_store;
452
+ }
453
+
454
+ public function add_signature_method($signature_method) {
455
+ $this->signature_methods[$signature_method->get_name()] =
456
+ $signature_method;
457
+ }
458
+
459
+ // high level functions
460
+
461
+ /**
462
+ * process a request_token request
463
+ * returns the request token on success
464
+ */
465
+ public function fetch_request_token(&$request) {
466
+ $this->get_version($request);
467
+
468
+ $consumer = $this->get_consumer($request);
469
+
470
+ // no token required for the initial token request
471
+ $token = NULL;
472
+
473
+ $this->check_signature($request, $consumer, $token);
474
+
475
+ $new_token = $this->data_store->new_request_token($consumer);
476
+
477
+ return $new_token;
478
+ }
479
+
480
+ /**
481
+ * process an access_token request
482
+ * returns the access token on success
483
+ */
484
+ public function fetch_access_token(&$request) {
485
+ $this->get_version($request);
486
+
487
+ $consumer = $this->get_consumer($request);
488
+
489
+ // requires authorized request token
490
+ $token = $this->get_token($request, $consumer, "request");
491
+
492
+
493
+ $this->check_signature($request, $consumer, $token);
494
+
495
+ $new_token = $this->data_store->new_access_token($token, $consumer);
496
+
497
+ return $new_token;
498
+ }
499
+
500
+ /**
501
+ * verify an api call, checks all the parameters
502
+ */
503
+ public function verify_request(&$request) {
504
+ $this->get_version($request);
505
+ $consumer = $this->get_consumer($request);
506
+ $token = $this->get_token($request, $consumer, "access");
507
+ $this->check_signature($request, $consumer, $token);
508
+ return array($consumer, $token);
509
+ }
510
+
511
+ // Internals from here
512
+ /**
513
+ * version 1
514
+ */
515
+ private function get_version(&$request) {
516
+ $version = $request->get_parameter("oauth_version");
517
+ if (!$version) {
518
+ $version = 1.0;
519
+ }
520
+ if ($version && $version != $this->version) {
521
+ throw new OAuthException("OAuth version '$version' not supported");
522
+ }
523
+ return $version;
524
+ }
525
+
526
+ /**
527
+ * figure out the signature with some defaults
528
+ */
529
+ private function get_signature_method(&$request) {
530
+ $signature_method =
531
+ @$request->get_parameter("oauth_signature_method");
532
+ if (!$signature_method) {
533
+ $signature_method = "PLAINTEXT";
534
+ }
535
+ if (!in_array($signature_method,
536
+ array_keys($this->signature_methods))) {
537
+ throw new OAuthException(
538
+ "Signature method '$signature_method' not supported " .
539
+ "try one of the following: " .
540
+ implode(", ", array_keys($this->signature_methods))
541
+ );
542
+ }
543
+ return $this->signature_methods[$signature_method];
544
+ }
545
+
546
+ /**
547
+ * try to find the consumer for the provided request's consumer key
548
+ */
549
+ private function get_consumer(&$request) {
550
+ $consumer_key = @$request->get_parameter("oauth_consumer_key");
551
+ if (!$consumer_key) {
552
+ throw new OAuthException("Invalid consumer key");
553
+ }
554
+
555
+ $consumer = $this->data_store->lookup_consumer($consumer_key);
556
+ if (!$consumer) {
557
+ throw new OAuthException("Invalid consumer");
558
+ }
559
+
560
+ return $consumer;
561
+ }
562
+
563
+ /**
564
+ * try to find the token for the provided request's token key
565
+ */
566
+ private function get_token(&$request, $consumer, $token_type="access") {
567
+ $token_field = @$request->get_parameter('oauth_token');
568
+ $token = $this->data_store->lookup_token(
569
+ $consumer, $token_type, $token_field
570
+ );
571
+ if (!$token) {
572
+ throw new OAuthException("Invalid $token_type token: $token_field");
573
+ }
574
+ return $token;
575
+ }
576
+
577
+ /**
578
+ * all-in-one function to check the signature on a request
579
+ * should guess the signature method appropriately
580
+ */
581
+ private function check_signature(&$request, $consumer, $token) {
582
+ // this should probably be in a different method
583
+ $timestamp = @$request->get_parameter('oauth_timestamp');
584
+ $nonce = @$request->get_parameter('oauth_nonce');
585
+
586
+ $this->check_timestamp($timestamp);
587
+ $this->check_nonce($consumer, $token, $nonce, $timestamp);
588
+
589
+ $signature_method = $this->get_signature_method($request);
590
+
591
+ $signature = $request->get_parameter('oauth_signature');
592
+ $valid_sig = $signature_method->check_signature(
593
+ $request,
594
+ $consumer,
595
+ $token,
596
+ $signature
597
+ );
598
+
599
+ if (!$valid_sig) {
600
+ throw new OAuthException("Invalid signature");
601
+ }
602
+ }
603
+
604
+ /**
605
+ * check that the timestamp is new enough
606
+ */
607
+ private function check_timestamp($timestamp) {
608
+ // verify that timestamp is recentish
609
+ $now = time();
610
+ if ($now - $timestamp > $this->timestamp_threshold) {
611
+ throw new OAuthException(
612
+ "Expired timestamp, yours $timestamp, ours $now"
613
+ );
614
+ }
615
+ }
616
+
617
+ /**
618
+ * check that the nonce is not repeated
619
+ */
620
+ private function check_nonce($consumer, $token, $nonce, $timestamp) {
621
+ // verify that the nonce is uniqueish
622
+ $found = $this->data_store->lookup_nonce(
623
+ $consumer,
624
+ $token,
625
+ $nonce,
626
+ $timestamp
627
+ );
628
+ if ($found) {
629
+ throw new OAuthException("Nonce already used: $nonce");
630
+ }
631
+ }
632
+
633
+ }
634
+
635
+ class OAuthDataStore {
636
+ function lookup_consumer($consumer_key) {
637
+ // implement me
638
+ }
639
+
640
+ function lookup_token($consumer, $token_type, $token) {
641
+ // implement me
642
+ }
643
+
644
+ function lookup_nonce($consumer, $token, $nonce, $timestamp) {
645
+ // implement me
646
+ }
647
+
648
+ function new_request_token($consumer) {
649
+ // return a new token attached to this consumer
650
+ }
651
+
652
+ function new_access_token($token, $consumer) {
653
+ // return a new access token attached to this consumer
654
+ // for the user associated with this token if the request token
655
+ // is authorized
656
+ // should also invalidate the request token
657
+ }
658
+
659
+ }
660
+
661
+ class OAuthUtil {
662
+ public static function urlencode_rfc3986($input) {
663
+ if (is_array($input)) {
664
+ return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
665
+ } else if (is_scalar($input)) {
666
+ return str_replace(
667
+ '+',
668
+ ' ',
669
+ str_replace('%7E', '~', rawurlencode($input))
670
+ );
671
+ } else {
672
+ return '';
673
+ }
674
+ }
675
+
676
+
677
+ // This decode function isn't taking into consideration the above
678
+ // modifications to the encoding process. However, this method doesn't
679
+ // seem to be used anywhere so leaving it as is.
680
+ public static function urldecode_rfc3986($string) {
681
+ return urldecode($string);
682
+ }
683
+
684
+ // Utility function for turning the Authorization: header into
685
+ // parameters, has to do some unescaping
686
+ // Can filter out any non-oauth parameters if needed (default behaviour)
687
+ public static function split_header($header, $only_allow_oauth_parameters = true) {
688
+ $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/';
689
+ $offset = 0;
690
+ $params = array();
691
+ while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {
692
+ $match = $matches[0];
693
+ $header_name = $matches[2][0];
694
+ $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];
695
+ if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {
696
+ $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);
697
+ }
698
+ $offset = $match[1] + strlen($match[0]);
699
+ }
700
+
701
+ if (isset($params['realm'])) {
702
+ unset($params['realm']);
703
+ }
704
+
705
+ return $params;
706
+ }
707
+
708
+ // helper to try to sort out headers for people who aren't running apache
709
+ public static function get_headers() {
710
+ if (function_exists('apache_request_headers')) {
711
+ // we need this to get the actual Authorization: header
712
+ // because apache tends to tell us it doesn't exist
713
+ return apache_request_headers();
714
+ }
715
+ // otherwise we don't have apache and are just going to have to hope
716
+ // that $_SERVER actually contains what we need
717
+ $out = array();
718
+ foreach ($_SERVER as $key => $value) {
719
+ if (substr($key, 0, 5) == "HTTP_") {
720
+ // this is chaos, basically it is just there to capitalize the first
721
+ // letter of every word that is not an initial HTTP and strip HTTP
722
+ // code from przemek
723
+ $key = str_replace(
724
+ " ",
725
+ "-",
726
+ ucwords(strtolower(str_replace("_", " ", substr($key, 5))))
727
+ );
728
+ $out[$key] = $value;
729
+ }
730
+ }
731
+ return $out;
732
+ }
733
+
734
+ // This function takes a input like a=b&a=c&d=e and returns the parsed
735
+ // parameters like this
736
+ // array('a' => array('b','c'), 'd' => 'e')
737
+ public static function parse_parameters( $input ) {
738
+ if (!isset($input) || !$input) return array();
739
+
740
+ $pairs = split('&', $input);
741
+
742
+ $parsed_parameters = array();
743
+ foreach ($pairs as $pair) {
744
+ $split = split('=', $pair, 2);
745
+ $parameter = OAuthUtil::urldecode_rfc3986($split[0]);
746
+ $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
747
+
748
+ if (isset($parsed_parameters[$parameter])) {
749
+ // We have already recieved parameter(s) with this name, so add to the list
750
+ // of parameters with this name
751
+
752
+ if (is_scalar($parsed_parameters[$parameter])) {
753
+ // This is the first duplicate, so transform scalar (string) into an array
754
+ // so we can add the duplicates
755
+ $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);
756
+ }
757
+
758
+ $parsed_parameters[$parameter][] = $value;
759
+ } else {
760
+ $parsed_parameters[$parameter] = $value;
761
+ }
762
+ }
763
+ return $parsed_parameters;
764
+ }
765
+
766
+ public static function build_http_query($params) {
767
+ if (!$params) return '';
768
+
769
+ // Urlencode both keys and values
770
+ $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
771
+ $values = OAuthUtil::urlencode_rfc3986(array_values($params));
772
+ $params = array_combine($keys, $values);
773
+
774
+ // Parameters are sorted by name, using lexicographical byte value ordering.
775
+ // Ref: Spec: 9.1.1 (1)
776
+ uksort($params, 'strcmp');
777
+
778
+ $pairs = array();
779
+ foreach ($params as $parameter => $value) {
780
+ if (is_array($value)) {
781
+ // If two or more parameters share the same name, they are sorted by their value
782
+ // Ref: Spec: 9.1.1 (1)
783
+ natsort($value);
784
+ foreach ($value as $duplicate_value) {
785
+ $pairs[] = $parameter . '=' . $duplicate_value;
786
+ }
787
+ } else {
788
+ $pairs[] = $parameter . '=' . $value;
789
+ }
790
+ }
791
+ // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
792
+ // Each name-value pair is separated by an '&' character (ASCII code 38)
793
+ return implode('&', $pairs);
794
+ }
795
+ }
796
+
797
+ ?>
lib/Vzaar/UploadSignature.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ //package com.vzaar;
3
+
4
+ /**
5
+ * Response from signature request that contains the GUID and an AWS S3
6
+ * signature. With these credentials the user will then be able upload a
7
+ * file into <a href="http://vzaar.com">vzaar</a> video storage area.
8
+ *
9
+ */
10
+ class UploadSignature {
11
+ ///////////////////////////////////////////////////////////////////////////
12
+ // Private Members ////////////////////////////////////////////////////////
13
+ ///////////////////////////////////////////////////////////////////////////
14
+
15
+ var $guid;
16
+ var $key;
17
+ var $https;
18
+ var $acl;
19
+ var $bucket;
20
+ var $policy;
21
+ var $expirationDate;
22
+ var $accessKeyId;
23
+ var $signature;
24
+
25
+ ///////////////////////////////////////////////////////////////////////////
26
+ // Public and Package Protected Methods ///////////////////////////////////
27
+ ///////////////////////////////////////////////////////////////////////////
28
+
29
+ /**
30
+ * Package protected constructor.
31
+ *
32
+ * @param guid the vzaar global unique identifier
33
+ * @param key a name for the S3 object that will store the uploaded
34
+ * file's data
35
+ * @param https
36
+ * @param acl the access control policy to apply to the uploaded file
37
+ * @param bucket the vzaar bucket that has been allocated for this file
38
+ * @param policy a Base64-encoded policy document that applies rules to
39
+ * file uploads sent by the S3 POST form. This document is used to authorise
40
+ * the form, and to impose conditions on the files that can be uploaded.
41
+ * @param expirationDate s Greenwich Mean Time (GMT) timestamp that
42
+ * specifies when the policy document will expire. Once a policy document
43
+ * has expired, the upload will fail
44
+ * @param accessKey the vzaar AWS Access Key Identifier credential
45
+ * @param signature a signature value that authorises the form and proves
46
+ * that only vzaar could have created it. This value is calculated by signing
47
+ * the policy document
48
+ */
49
+ function __construct($guid, $key, $https, $acl,
50
+ $bucket, $policy, $expirationDate,
51
+ $accessKeyId, $signature) {
52
+ $this->guid = $guid;
53
+ $this->key = $key;
54
+ $this->https = $https;
55
+ $this->acl = $acl;
56
+ $this->bucket = $bucket;
57
+ $this->policy = $policy;
58
+ $this->expirationdate = $expirationDate;
59
+ $this->accesskeyid = $accessKeyId;
60
+ $this->signature = $signature;
61
+ }
62
+
63
+ static function fromJson($data) {
64
+ $jo = json_decode($data);
65
+ return $jo;
66
+ }
67
+
68
+ static function fromXml ($data) {
69
+ $sig = new XMLToArray( $data, array(), array(), true, false );
70
+
71
+ return $sig->getArray();
72
+ }
73
+ }
74
+ ?>
lib/Vzaar/User.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * User's public details along with it's relevant metadata.
4
+ * @author Skitsanos
5
+ */
6
+
7
+ require_once 'VzaarException.php';
8
+
9
+ class User {
10
+ var $version;
11
+ var $authorName;
12
+ var $authorId;
13
+ var $authorUrl;
14
+ var $authorAccount;
15
+ var $createdAt;
16
+ var $videoCount;
17
+ var $playCount;
18
+
19
+ static function fromJson($data) {
20
+
21
+ $jo = json_decode($data);
22
+
23
+ if($jo==NULL) {
24
+ throw new VzaarException('Object not found');
25
+ }
26
+ else {
27
+ $user = new User();
28
+
29
+ $user->authorName = $jo->author_url;
30
+ $user->playCount = $jo->play_count;
31
+ $user->authorId = $jo->author_id;
32
+ $user->authorUrl = $jo->author_url;
33
+ $user->createdAt = $jo->created_at;
34
+ $user->authorAccount = $jo->author_account;
35
+ $user->videoCount = $jo->video_count;
36
+ $user->version = $jo->version;
37
+ return $user;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Package protected constructor.
43
+ *
44
+ * @param version the vzaar API version number.
45
+ * @param authorName the vzaar user name (i.e. their login)
46
+ * @param authorId the vzaar user id
47
+ * @param authorUrl a link to the vzaar user summary page
48
+ * @param authorAccount a number representing the users vzaar
49
+ * account. 1 represents a free account
50
+ * @param createdAt the date time the video was uploaded. Will be
51
+ * in UTC format
52
+ * @param videoCount the number of active videos in the users
53
+ * account
54
+ * @param playCount the number of times all the users videos
55
+ * have been played
56
+ */
57
+ function __construct() {
58
+ }
59
+
60
+ function __construct1($version, $authorName, $authorId, $authorUrl, $authorAccount, $createdAt, $videoCount, $playCount) {
61
+ $this->version = $version;
62
+ $this->authorName = $authorName;
63
+ $this->authorId = $authorId;
64
+ $this->authorUrl = $authorUrl;
65
+ $this->authorAccount = $authorAccount;
66
+ $this->createdAt = $createdAt;
67
+ $this->videoCount = $videoCount;
68
+ $this->playCount = $playCount;
69
+ }
70
+
71
+ /**
72
+ * String representation of the user bean.
73
+ */
74
+ public function toString() {
75
+ return
76
+ "version=" . $this->version .
77
+ ", authorName=" . $this->authorName .
78
+ ", authorId=" . $this->authorId .
79
+ ", authorUrl=" . $this->authorUrl .
80
+ ", authorAccount=" . $this->authorAccount .
81
+ ", createdAt=" . $this->createdAt .
82
+ ", videoCount=" . $this->videoCount .
83
+ ", playCount=" . $this->playCount;
84
+ }
85
+ }
86
+ ?>
lib/Vzaar/Video.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Active video details along with it's relevant metadata.
4
+ *
5
+ */
6
+ require_once 'User.php';
7
+
8
+ class Video
9
+ {
10
+ var $version;
11
+ var $id;
12
+ var $title;
13
+ var $description;
14
+ var $createdAt;
15
+ var $url;
16
+ var $thumbnail;
17
+ var $playCount;
18
+ var $duration;
19
+ var $width;
20
+ var $height;
21
+ var $framegrabUrl;
22
+
23
+ var $user;
24
+
25
+ static function fromJson($data)
26
+ {
27
+ $jo = json_decode($data);
28
+
29
+ $video = new Video();
30
+ $video->duration = $jo->duration;
31
+ $video->playCount = $jo->play_count;
32
+ $video->title = $jo->title;
33
+ $video->url = $jo->url;
34
+ $video->createdAt = $jo->created_at;
35
+ $video->version = $jo->version;
36
+ $video->user = new User();
37
+ $video->user->authorAccount = $jo->user->author_account;
38
+ $video->user->authorName = $jo->user->author_name;
39
+ $video->user->authorUrl = $jo->user->author_url;
40
+ $video->user->videoCount = $jo->user->video_count;
41
+ $video->id = $jo->id;
42
+ $video->thumbnail = $jo->thumbnail;
43
+ $video->width = $jo->width;
44
+ $video->height = $jo->height;
45
+ $video->framegrabUrl = 'http://vzaar.com/videos/' . $jo->id . '.frame';
46
+
47
+ return $video;
48
+ }
49
+
50
+
51
+ /**
52
+ * Package protected constructor.
53
+ *
54
+ * @param version the vzaar API version number
55
+ * @param id the video ID number
56
+ * @param title the video title. It may be null
57
+ * @param description the video description. It may be null
58
+ * @param createdAt the date time the video was uploaded
59
+ * @param url the link to the video page
60
+ * @param thumbnailUrl the URL link that points to the video thumbnail
61
+ * @param playCount the number of times the video has been played
62
+ * @param authorName the vzaar user name (i.e. their login)
63
+ * @param authorUrl the link to the vzaar user summary page
64
+ * @param authorAccount the number representing the users vzaar account
65
+ * @param videoCount the number of active videos in the users account
66
+ * @param duration the duration of the video
67
+ * @param <integer> width the width of the video
68
+ * @param height the height of the video
69
+ */
70
+ public function __construct1($version, $id, $title, $description, $createdAt, $url, $thumbnailUrl, $playCount, $authorName, $authorUrl, $authorAccount, $videoCount, $duration, $width, $height)
71
+ {
72
+ $this->user = new User();
73
+
74
+ $this->version = $version;
75
+ $this->id = $id;
76
+ $this->title = $title;
77
+ $this->description = $description;
78
+ $this->createdAt = $createdAt;
79
+ $this->url = $url;
80
+ $this->thumbnailUrl = $thumbnailUrl;
81
+ $this->playCount = $playCount;
82
+ $this->user->authorName = $authorName;
83
+ $this->user->authorUrl = $authorUrl;
84
+ $this->user->authorAccount = $authorAccount;
85
+ $this->user->videoCount = $videoCount;
86
+ $this->duration = $duration;
87
+ $this->width = $width;
88
+ $this->height = $height;
89
+ }
90
+ }
91
+
92
+ ?>
lib/Vzaar/VideoDetails.php ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Active video and oEmbed details along with it's relevant metadata.
5
+ *
6
+ */
7
+ class VideoDetails
8
+ {
9
+
10
+ var $type;
11
+ var $version;
12
+ var $title;
13
+ var $description;
14
+ var $playCount;
15
+ var $authorName;
16
+ var $authorUrl;
17
+ var $authorAccount;
18
+ var $providerName;
19
+ var $providerUrl;
20
+ var $thumbnailUrl;
21
+ var $thumbnailWidth;
22
+ var $thumbnailHeight;
23
+ var $framegrabUrl;
24
+ var $framegrabWidth;
25
+ var $framegrabHeight;
26
+ var $html;
27
+ var $height;
28
+ var $width;
29
+ var $borderless;
30
+ var $duration;
31
+ var $videoStatus;
32
+ var $videoStatusDescription;
33
+
34
+ /**
35
+ * Package protected constructor.
36
+ *
37
+ * @param type the oEmbed resource type
38
+ * @param version the vzaar API version number
39
+ * @param title the video title. It may be null
40
+ * @param description the video description. It may be null
41
+ * @param authorName the vzaar user name (i.e. their login)
42
+ * @param authorUrl the link to the vzaar user summary page
43
+ * @param authorAccount the number representing the users vzaar account
44
+ * @param providerName this will always be vzaar
45
+ * @param providerUrl this will always be http://vzaar.com
46
+ * @param thumbnailUrl the URL link that points to the video thumbnail
47
+ * @param thumbnailWidth the width of the thumbnail in pixels
48
+ * @param thumbnailHeight the height of the thumbnail in pixels
49
+ * @param framegrabUrl the URL that points to a framegrab of the video
50
+ * @param framegrabWidth the width of the frame grab in pixels
51
+ * @param framegrabHeight the height of the frame grab in pixels
52
+ * @param html the exact HTML you need to use to embed the video into a webpage
53
+ * @param height the height of the video
54
+ * @param width the width of the video
55
+ * @param borderless does the video player has no border
56
+ * @param duration the duration of the video
57
+ */
58
+ function __construct()
59
+ {
60
+
61
+ }
62
+
63
+ function __construct1($type, $version, $title, $description, $authorName, $authorUrl, $authorAccount, $providerName, $providerUrl, $thumbnailUrl, $thumbnailWidth, $thumbnailHeight, $framegrabUrl, $framegrabWidth, $framegrabHeight, $html, $height, $width, $borderless, $duration, $videoStatus)
64
+ {
65
+ $this->type = $type;
66
+ $this->version = $version;
67
+ $this->title = $title;
68
+ $this->description = $description;
69
+ $this->user->authorName = $authorName;
70
+ $this->user->authorUrl = $authorUrl;
71
+ $this->user->authorAccount = $authorAccount;
72
+ $this->providerName = $providerName;
73
+ $this->providerUrl = $providerUrl;
74
+ $this->thumbnailUrl = $thumbnailUrl;
75
+ $this->thumbnailWidth = $thumbnailWidth;
76
+ $this->thumbnailHeight = $thumbnailHeight;
77
+ $this->framegrabUrl = $framegrabUrl;
78
+ $this->framegrabWidth = $framegrabWidth;
79
+ $this->framegrabHeight = $framegrabHeight;
80
+ $this->html = $html;
81
+ $this->height = $height;
82
+ $this->width = $width;
83
+ $this->borderless = $borderless;
84
+ $this->duration = $duration;
85
+ $this->videoStatus = $videoStatus;
86
+ }
87
+
88
+ /**
89
+ * Contructs Video Details object from JSON
90
+ * @param <type> $data
91
+ * @return VideoDetails
92
+ */
93
+ static function fromJson($data)
94
+ {
95
+ $jo = json_decode($data); //error messages comes in format like this: "{"error":"In progress"}"
96
+ if ($jo == NULL)
97
+ {
98
+ return NULL;
99
+ }
100
+ else
101
+ {
102
+ $vid = new VideoDetails();
103
+ if (array_key_exists('error', $jo))
104
+ {
105
+ if (strpos($jo->error, 'progress'))
106
+ {
107
+ $vid->type = 'video';
108
+ $vid->videoStatus = VideoStatus::PROCESSING;
109
+ $vid->videoStatusDescription = VideoStatusDescriptions::PROCESSING;
110
+ }
111
+ }
112
+ else
113
+ {
114
+ if (array_key_exists('vzaar-api', $jo))
115
+ {
116
+ $vars = get_object_vars($jo);
117
+ if (array_key_exists('error', $vars['vzaar-api']))
118
+ {
119
+ throw new VzaarException($vars['vzaar-api']->error->type);
120
+ }
121
+ else
122
+ {
123
+ $vid->type = $vars['vzaar-api']->type;
124
+ $vid->videoStatus = $vars['vzaar-api']->video_status_id;
125
+ $vid->videoStatusDescription = $vars['vzaar-api']->state;
126
+ }
127
+ }
128
+ else
129
+ {
130
+ $vid->authorAccount = $jo->author_account;
131
+ $vid->authorName = $jo->author_name;
132
+ $vid->authorUrl = $jo->author_url;
133
+ $vid->borderless = (array_key_exists('borderless', $jo) ? $jo->borderless : NULL);
134
+ $vid->description = (array_key_exists('description', $jo) ? $jo->description : NULL);
135
+ $vid->duration = (array_key_exists('duration', $jo) ? $jo->duration : NULL);
136
+ $vid->framegrabHeight = (array_key_exists('framegreb_height', $jo) ? $jo->framegreb_height : NULL);
137
+ $vid->framegrabUrl = (array_key_exists('framegrab_url', $jo) ? $jo->framegrab_url : NULL);
138
+ $vid->framegrabWidth = (array_key_exists('framegrab_width', $jo) ? $jo->framegrab_width : NULL);
139
+ $vid->height = $jo->height;
140
+ $vid->html = $jo->html;
141
+ $vid->providerName = $jo->provider_name;
142
+ $vid->providerUrl = $jo->provider_url;
143
+ $vid->thumbnailHeight = (array_key_exists('thumbnail_height', $jo) ? $jo->thumbnail_height : NULL);
144
+ $vid->thumbnailUrl = (array_key_exists('thumbnail_url', $jo) ? $jo->thumbnail_url : NULL);
145
+ $vid->thumbnailWidth = (array_key_exists('thumbnail_width', $jo) ? $jo->thumbnail_width : NULL);
146
+ $vid->title = $jo->title;
147
+ $vid->playCount = $jo->play_count;
148
+ $vid->type = $jo->type;
149
+ $vid->version = $jo->version;
150
+ $vid->width = $jo->width;
151
+ $vid->videoStatus = (array_key_exists('video_status_id', $jo) ? $jo->video_status_id : 0);
152
+ $vid->videoStatusDescription = (array_key_exists('video_status_description', $jo) ? $jo->video_status_description : '');
153
+ }
154
+ }
155
+ return $vid;
156
+ }
157
+ }
158
+
159
+ }
160
+
161
+ ?>
lib/Vzaar/VideoList.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * To change this template, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+
7
+ /**
8
+ * VideoList
9
+ *
10
+ * @author Skitsanos
11
+ */
12
+ require_once 'Video.php';
13
+ require_once 'User.php';
14
+ require_once 'VzaarException.php';
15
+
16
+ class VideoList {
17
+ var $items;
18
+
19
+ static function fromJson($data) {
20
+ $jo = (array)json_decode($data);
21
+
22
+ if(array_key_exists('error', $jo)) {
23
+ throw new VzaarException($jo->error);
24
+ }
25
+ else {
26
+ $videos = array();
27
+
28
+ for ($i = 0, $l=count($jo); $i<$l; $i++) {
29
+ $video = new Video();
30
+ $video->duration = $jo[$i]->duration;
31
+ $video->playCount = $jo[$i]->play_count;
32
+ $video->title = $jo[$i]->title;
33
+ $video->url = $jo[$i]->url;
34
+ $video->createdAt = $jo[$i]->created_at;
35
+ $video->version = $jo[$i]->version;
36
+ $video->user= new User();
37
+ $video->user->authorAccount = $jo[$i]->user->author_account;
38
+ $video->user->authorName = $jo[$i]->user->author_name;
39
+ $video->user->authorUrl = $jo[$i]->user->author_url;
40
+ $video->user->videoCount = $jo[$i]->user->video_count;
41
+ $video->id = $jo[$i]->id;
42
+ $video->thumbnail = $jo[$i]->thumbnail;
43
+ $video->width = $jo[$i]->width;
44
+ $video->height = $jo[$i]->height;
45
+ $video->framegrabUrl = 'http://vzaar.com/videos/' . $jo[$i]->id . '.frame';
46
+
47
+ array_push($videos, $video);
48
+ }
49
+
50
+ return $videos;
51
+ }
52
+ }
53
+ }
54
+ ?>
lib/Vzaar/Vzaar.php ADDED
@@ -0,0 +1,502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Vzaar API Framework
5
+ * @author Skitsanos
6
+ */
7
+ require_once 'OAuth.php';
8
+ require_once 'HttpRequest1.php';
9
+ require_once 'AccountType.php';
10
+ require_once 'User.php';
11
+ require_once 'VideoDetails.php';
12
+ require_once 'VideoList.php';
13
+ require_once 'UploadSignature.php';
14
+
15
+ date_default_timezone_set('UTC');
16
+ // Check for CURL
17
+ if (!extension_loaded('curl') && !@dl(PHP_SHLIB_SUFFIX == 'so' ? 'curl.so' : 'php_curl.dll')) exit("\nERROR: CURL extension not loaded\n\n");
18
+
19
+ Class Profile
20
+ {
21
+ const Small = 1;
22
+ const Medium = 2;
23
+ const Large = 3;
24
+ const HighDefinition = 4;
25
+ const Original = 5;
26
+ }
27
+
28
+ Class VideoStatus
29
+ {
30
+ const PROCESSING = 1; //Processing not complete
31
+ const AVAILABLE = 2; //Available (processing complete, video ready)
32
+ const EXPIRED = 3; //Expired
33
+ const ON_HOLD = 4; //On Hold (waiting for encoding to be available)
34
+ const FAILED = 5; //Encoding Failed
35
+ const ENCODING_UNAVAILABLE = 6; //Encoding Unavailable
36
+ const NOT_AVAILABLE = 7; //n/a
37
+ const REPLACED = 8; //Replaced
38
+ const DELETED = 9; //Deleted
39
+ }
40
+
41
+ Class VideoStatusDescriptions
42
+ {
43
+ const PROCESSING = "Processing not complete";
44
+ const AVAILABLE = "Available (processing complete, video ready)";
45
+ const EXPIRED = "Expired";
46
+ const ON_HOLD = "On Hold (waiting for encoding to be available)";
47
+ const FAILED = "Ecoding Failed";
48
+ const ENCODING_UNAVAILABLE = "Encoding Unavailable";
49
+ const NOT_AVAILABLE = "n/a";
50
+ const REPLACED = "Replaced";
51
+ const DELETED = "Deleted";
52
+ }
53
+
54
+ class Vzaar
55
+ {
56
+ public static $url;
57
+ public static $token = '';
58
+ public static $secret = '';
59
+ public static $enableFlashSupport = false;
60
+
61
+ /**
62
+ * The live vzaar API URL ("https://vzaar.com/"). This is the default URL.
63
+ *
64
+ */
65
+ const URL_LIVE = "https://vzaar.com/";
66
+
67
+ public static function getUserEndpoint($user)
68
+ {
69
+ return Vzaar::URL_LIVE . 'users/' . $user . '.json';
70
+ }
71
+
72
+ public static function getVideosEndpoint($user, $count = 1)
73
+ {
74
+ return Vzaar::URL_LIVE . 'api/' . $user . '/videos.json?count=' . $count;
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @return <string>
80
+ */
81
+ public static function whoAmI()
82
+ {
83
+ $_url = Vzaar::URL_LIVE . 'api/test/whoami.json';
84
+
85
+ $req = Vzaar::setAuth($_url);
86
+
87
+ $c = new HttpRequest1($_url);
88
+
89
+ array_push($c->headers, $req->to_header());
90
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
91
+ return json_decode($c->send())->vzaar_api->test->login;
92
+ }
93
+
94
+ /**
95
+ * This API call returns the details and rights for each vzaar account
96
+ * type along with it's relevant metadata
97
+ * http://vzaar.com/api/accounts/{account}.json
98
+ * @param <integer> $account is the vzaar account type. This is an integer.
99
+ * @return <AccountType>
100
+ */
101
+ public static function getAccountDetails($account)
102
+ {
103
+ $_url = Vzaar::URL_LIVE;
104
+
105
+ $c = new HttpRequest1($_url . 'api/accounts/' . $account . '.json');
106
+ return AccountType::fromJson($c->send());
107
+ }
108
+
109
+ /**
110
+ * This API call returns the user's public details along with it's
111
+ * relevant metadata
112
+ * @param <string> $account
113
+ */
114
+ public static function getUserDetails($account)
115
+ {
116
+ $_url = Vzaar::URL_LIVE;
117
+
118
+ $req = new HttpRequest1($_url . 'api/' . $account . '.json');
119
+
120
+ return User::fromJson($req->send());
121
+ }
122
+
123
+ /**
124
+ * This API call returns a list of the user's active videos along with it's
125
+ * relevant metadata
126
+ * http://vzaar.com/api/vzaar/videos.xml?title=vzaar
127
+ * @param <string> $username is the vzaar login name for the user. Note: This must be the username and not the email address
128
+ * @param <integer> $count
129
+ * @return <VideoList>
130
+ */
131
+ public static function getVideoList($username, $auth = false, $count = 20, $page=1, $labels = '', $status = '')
132
+ {
133
+ $_url = Vzaar::URL_LIVE . 'api/' . $username . '/videos.json?count=' . $count.'&page='.$page;
134
+ if ($labels != '') $_url .= "&labels=" . $labels;
135
+
136
+ if ($status != '') $_url .= '&status' . $status;
137
+
138
+ $req = new HttpRequest1($_url);
139
+
140
+ if ($auth) array_push($req->headers, Vzaar::setAuth($_url, 'GET')->to_header());
141
+
142
+ return VideoList::fromJson($req->send());
143
+ }
144
+
145
+ /**
146
+ * This API call returns a list of the user's active videos along with it's
147
+ * relevant metadata
148
+ * @param <string> $username the vzaar login name for the user. Note: This must be the actual username and not the email address
149
+ * @param <string> $title Return only videos with title containing given string
150
+ * @param <integer> $count Specifies the number of videos to retrieve per page. Default is 20. Maximum is 100
151
+ * @param <integer> $page Specifies the page number to retrieve. Default is 1
152
+ * @param <string> $sort Values can be asc (least_recent) or desc (most_recent). Defaults to desc
153
+ * @return <VideoList>
154
+ */
155
+ public static function searchVideoList($username, $auth = false, $title = '', $labels = '', $count = 20, $page = 1, $sort = 'desc')
156
+ {
157
+ $_url = Vzaar::URL_LIVE . 'api/' . $username . '/videos.json?count=' . $count . '&page=' . $page . '&sort=' . $sort;
158
+ if ($labels != '' || $labels != null) $_url .= "&labels=" . $labels;
159
+
160
+ if ($title != '') $_url .= '&title=' . urlencode($title);
161
+
162
+ $req = new HttpRequest1($_url);
163
+
164
+ if ($auth) array_push($req->headers, Vzaar::setAuth($_url, 'GET')->to_header());
165
+
166
+ return VideoList::fromJson($req->send());
167
+ }
168
+
169
+ /**
170
+ * vzaar uses the oEmbed open standard for allowing 3rd parties to
171
+ * integrated with the vzaar. You can use the vzaar video URL to easily
172
+ * obtain the appropriate embed code for that video
173
+ * @param <integer> $id is the vzaar video number for that video
174
+ * @return <VideoDetails>
175
+ */
176
+ public static function getVideoDetails($id, $auth = false)
177
+ {
178
+ $_url = Vzaar::URL_LIVE . 'api/videos/' . $id . '.json';
179
+
180
+ $req = new HttpRequest1($_url);
181
+
182
+ if ($auth) array_push($req->headers, Vzaar::setAuth($_url, 'GET')->to_header());
183
+
184
+ return VideoDetails::fromJson($req->send());
185
+ }
186
+
187
+ /**
188
+ *
189
+ * @param <string> $path
190
+ * @return <string> GUID of the file uploaded
191
+ */
192
+ public static function uploadVideo($path)
193
+ {
194
+ $signature = Vzaar::getUploadSignature();
195
+
196
+ $c = new HttpRequest1('https://' . $signature['vzaar-api']['bucket'] . '.s3.amazonaws.com/');
197
+
198
+ $c->method = 'POST';
199
+ $c->uploadMode = true;
200
+ $c->verbose = false;
201
+ $c->useSsl = true;
202
+
203
+ array_push($c->headers, 'User-Agent: Vzaar API Client');
204
+ array_push($c->headers, 'x-amz-acl: ' . $signature['vzaar-api']['acl']);
205
+ array_push($c->headers, 'Enclosure-Type: multipart/form-data');
206
+
207
+ $s3Headers = array('AWSAccessKeyId' => $signature['vzaar-api']['accesskeyid'], 'Signature' => $signature['vzaar-api']['signature'], 'acl' => $signature['vzaar-api']['acl'], 'bucket' => $signature['vzaar-api']['bucket'], 'policy' => $signature['vzaar-api']['policy'], 'success_action_status' => 201, 'key' => $signature['vzaar-api']['key'], 'file' => "@" . $path);
208
+
209
+ $reply = $c->send($s3Headers, $path);
210
+ echo($reply);
211
+ $xmlObj = new XMLToArray($reply, array(), array(), true, false);
212
+ $arrObj = $xmlObj->getArray();
213
+ $key = explode('/', $arrObj['PostResponse']['Key']);
214
+ return $key[sizeOf($key) - 2];
215
+ }
216
+
217
+ /**
218
+ *
219
+ */
220
+ public static function getUploadSignature($redirectUrl = null)
221
+ {
222
+ $_url = Vzaar::URL_LIVE . "api/videos/signature";
223
+
224
+ if (Vzaar::$enableFlashSupport)
225
+ {
226
+ $_url .= '?flash_request=true';
227
+ }
228
+
229
+ if ($redirectUrl != null)
230
+ {
231
+ if (Vzaar::$enableFlashSupport)
232
+ {
233
+ $_url .= '&success_action_redirect=' . $redirectUrl;
234
+ }
235
+ else
236
+ {
237
+ $_url .= '?success_action_redirect=' . $redirectUrl;
238
+ }
239
+ }
240
+
241
+ $req = Vzaar::setAuth($_url, 'GET');
242
+
243
+ $c = new HttpRequest1($_url);
244
+ $c->method = 'GET';
245
+ array_push($c->headers, $req->to_header());
246
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
247
+
248
+ return UploadSignature::fromXml($c->send());
249
+ }
250
+
251
+ public static function getUploadSignatureAsXml($redirectUrl = null)
252
+ {
253
+ $_url = Vzaar::URL_LIVE . "api/videos/signature";
254
+
255
+ if (Vzaar::$enableFlashSupport)
256
+ {
257
+ $_url .= '?flash_request=true';
258
+ }
259
+
260
+ if ($redirectUrl != null)
261
+ {
262
+ if (Vzaar::$enableFlashSupport)
263
+ {
264
+ $_url .= '&success_action_redirect=' . $redirectUrl;
265
+ }
266
+ else
267
+ {
268
+ $_url .= '?success_action_redirect=' . $redirectUrl;
269
+ }
270
+ }
271
+
272
+ $req = Vzaar::setAuth($_url, 'GET');
273
+
274
+ $c = new HttpRequest1($_url);
275
+ $c->method = 'GET';
276
+ array_push($c->headers, $req->to_header());
277
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
278
+
279
+ return $c->send();
280
+ }
281
+
282
+ public static function deleteVideo($id)
283
+ {
284
+ $_url = Vzaar::URL_LIVE . "api/videos/" . $id . ".xml";
285
+
286
+ $req = Vzaar::setAuth($_url, 'DELETE');
287
+
288
+ $data = '<?xml version="1.0" encoding="UTF-8"?><vzaar-api><_method>delete</_method></vzaar-api>';
289
+
290
+ $c = new HttpRequest1($_url);
291
+ $c->method = 'DELETE';
292
+ array_push($c->headers, $req->to_header());
293
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
294
+ array_push($c->headers, 'Connection: close');
295
+ array_push($c->headers, 'Content-Type: application/xml');
296
+
297
+ return $c->send($data);
298
+ }
299
+
300
+ public static function editVideo($id, $title, $description, $private = 'false', $seoUrl = '')
301
+ {
302
+ $_url = Vzaar::URL_LIVE . "api/videos/" . $id . ".xml";
303
+
304
+ $req = Vzaar::setAuth($_url, 'POST');
305
+
306
+ $data = '<?xml version="1.0" encoding="UTF-8"?><vzaar-api><_method>put</_method><video><title>' . $title . '</title><description>' . $description . '</description>';
307
+ if ($private != '') $data .= '<private>' . $private . '</private>';
308
+ if ($seoUrl != '') $data .= '<seo_url>' . $seoUrl . '</seo_url>';
309
+ $data .= '</video></vzaar-api>';
310
+
311
+ $c = new HttpRequest1($_url);
312
+ $c->method = 'POST';
313
+ array_push($c->headers, $req->to_header());
314
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
315
+ array_push($c->headers, 'Connection: close');
316
+ array_push($c->headers, 'Content-Type: application/xml');
317
+
318
+ return $c->send($data);
319
+ }
320
+
321
+ /**
322
+ * This API call tells the vzaar system to process a newly uploaded video. This will encode it if necessary and
323
+ * then provide a vzaar video idea back.
324
+ * http://developer.vzaar.com/docs/version_1.0/uploading/process
325
+ * @static
326
+ * @param string $guid Specifies the guid to operate on
327
+ * @param string $title Specifies the title for the video
328
+ * @param string $description Specifies the description for the video
329
+ * @param string $labels
330
+ * @param Profile $profile Specifies the size for the video to be encoded in. If not specified, this will use the vzaar default
331
+ * @param string $replace Specifies the video ID of an existing video that you wish to replace with the new video.
332
+ * @param boolean $transcoding If True forces vzaar to transcode the video, false makes vzaar use the original source file (available only for mp4 and flv files)
333
+ * @return string
334
+ */
335
+ public static function processVideo($guid, $title, $description, $labels, $profile = Profile::Medium, $transcoding = false, $replace = '')
336
+ {
337
+ $_url = Vzaar::URL_LIVE . "api/videos";
338
+
339
+ if ($replace != '') $replace = '<replace_id>' . $replace . '</replace_id>';
340
+
341
+ $req = Vzaar::setAuth($_url, 'POST');
342
+
343
+ $data = '<vzaar-api>
344
+ <video>' . $replace . '
345
+ <guid>' . $guid . '</guid>
346
+ <title>' . $title . '</title>
347
+ <description>' . $description . '</description>
348
+ <labels>' . $labels . '</labels>
349
+ <profile>' . $profile . '</profile>';
350
+ if ($transcoding) $data .= '<transcoding>true</transcoding>';
351
+ $data .= '</video> </vzaar-api>';
352
+
353
+ $c = new HttpRequest1($_url);
354
+ $c->verbose = false;
355
+ $c->method = "POST";
356
+ array_push($c->headers, $req->to_header());
357
+ array_push($c->headers, 'User-Agent: Vzaar OAuth Client');
358
+ array_push($c->headers, 'Connection: close');
359
+ array_push($c->headers, 'Content-Type: application/xml');
360
+
361
+ $apireply = new XMLToArray($c->send($data));
362
+ return $apireply->_data[0]["vzaar-api"]["video"];
363
+ }
364
+
365
+ public static function setAuth($_url, $_method = 'GET')
366
+ {
367
+ $consumer = new OAuthConsumer('', '');
368
+ $token = new OAuthToken(Vzaar::$secret, Vzaar::$token);
369
+ $req = OAuthRequest::from_consumer_and_token($consumer, $token, $_method, $_url);
370
+ $req->set_parameter('oauth_signature_method', 'HMAC-SHA1');
371
+ $req->set_parameter('oauth_signature', $req->build_signature(new OAuthSignatureMethod_HMAC_SHA1, $consumer, $token));
372
+ return $req;
373
+ }
374
+
375
+ }
376
+
377
+ class XMLToArray
378
+ {
379
+
380
+ var $_data = Array();
381
+ var $_name = Array();
382
+ var $_rep = Array();
383
+ var $_parser = 0;
384
+ var $_ignore = Array(), $_replace = Array(), $_showAttribs;
385
+ var $_level = 0;
386
+
387
+ function XMLToArray($data, $ignore = Array(), $replace = Array(), $showattribs = false, $toupper = false)
388
+ {
389
+ $this->_showAttribs = $showattribs;
390
+ $this->_parser = xml_parser_create();
391
+
392
+ xml_set_object($this->_parser, $this);
393
+ if ($toupper)
394
+ {
395
+ foreach ((array)$ignore as $key => $value) $this->_ignore[strtoupper($key)] = strtoupper($value);
396
+ foreach ((array)$replace as $key => $value) $this->_replace[strtoupper($key)] = strtoupper($value);
397
+ xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, true);
398
+ }
399
+ else
400
+ {
401
+ $this->_ignore = &$ignore;
402
+ $this->_replace = &$replace;
403
+ xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
404
+ }
405
+ xml_set_element_handler($this->_parser, '_startElement', '_endElement');
406
+ xml_set_character_data_handler($this->_parser, '_cdata');
407
+
408
+ $this->_data = array();
409
+ $this->_level = 0;
410
+ if (!xml_parse($this->_parser, $data, true))
411
+ {
412
+ //new Error("XML Parse Error: ".xml_error_string(xml_get_error_code($this->_parser))."n on line: ".xml_get_current_line_number($this->_parser),true);
413
+ return false;
414
+ }
415
+ xml_parser_free($this->_parser);
416
+ }
417
+
418
+ function & getArray()
419
+ {
420
+ return $this->_data[0];
421
+ }
422
+
423
+ function & getReplaced()
424
+ {
425
+ return $this->_data['_Replaced_'];
426
+ }
427
+
428
+ function & getAttributes()
429
+ {
430
+ return $this->_data['_Attributes_'];
431
+ }
432
+
433
+ function _startElement($parser, $name, $attrs)
434
+ {
435
+ if (!isset($this->_rep[$name])) $this->_rep[$name] = 0;
436
+ if (!in_array($name, $this->_ignore))
437
+ {
438
+ $this->_addElement($name, $this->_data[$this->_level], $attrs, true);
439
+ $this->_name[$this->_level] = $name;
440
+ $this->_level++;
441
+ }
442
+ }
443
+
444
+ function _endElement($parser, $name)
445
+ {
446
+ if (!in_array($name, $this->_ignore) && isset($this->_name[$this->_level - 1]))
447
+ {
448
+ if (isset($this->_data[$this->_level])) $this->_addElement($this->_name[$this->_level - 1], $this->_data[$this->_level - 1], $this->_data[$this->_level], false);
449
+
450
+ unset($this->_data[$this->_level]);
451
+ $this->_level--;
452
+ $this->_rep[$name]++;
453
+ }
454
+ }
455
+
456
+ function _cdata($parser, $data)
457
+ {
458
+ if (!empty($this->_name[$this->_level - 1])) $this->_addElement($this->_name[$this->_level - 1], $this->_data[$this->_level - 1], str_replace(array('&gt;', '&lt;', '&quot;', '&amp;'), array('>', '<', '"', '&'), $data), false);
459
+ }
460
+
461
+ function _addElement(&$name, &$start, $add = array(), $isattribs = false)
462
+ {
463
+ if (((sizeof($add) == 0) && is_array($add)) || !$add)
464
+ {
465
+ if (!isset($start[$name])) $start[$name] = '';
466
+ $add = '';
467
+ //if (is_array($add)) return;
468
+ //return;
469
+ }
470
+ if (!empty($this->_replace[$name]) && ('_ARRAY_' === strtoupper($this->_replace[$name])))
471
+ {
472
+ if (!$start[$name]) $this->_rep[$name] = 0;
473
+ $update = &$start[$name][$this->_rep[$name]];
474
+ }
475
+ elseif (!empty($this->_replace[$name]))
476
+ {
477
+ if ($add[$this->_replace[$name]])
478
+ {
479
+ $this->_data['_Replaced_'][$add[$this->_replace[$name]]] = $name;
480
+ $name = $add[$this->_replace[$name]];
481
+ }
482
+ $update = &$start[$name];
483
+ }
484
+ else
485
+ {
486
+ $update = &$start[$name];
487
+ }
488
+
489
+ if ($isattribs && !$this->_showAttribs)
490
+ {
491
+ return;
492
+ }
493
+ elseif ($isattribs) $this->_data['_Attributes_'][$this->_level][$name][] = $add;
494
+ elseif (is_array($add) && is_array($update)) $update += $add;
495
+ elseif (is_array($update)) return;
496
+ elseif (is_array($add)) $update = $add;
497
+ elseif ($add) $update .= $add;
498
+ }
499
+
500
+ }
501
+
502
+ ?>
lib/Vzaar/VzaarException.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ //package com.vzaar;
3
+
4
+ /**
5
+ * Vzaar exception general use class.
6
+ * @author Skitsanos
7
+ */
8
+ interface IException {
9
+ /* Protected methods inherited from Exception class */
10
+ public function getMessage(); // Exception message
11
+ public function getCode(); // User-defined Exception code
12
+ public function getFile(); // Source filename
13
+ public function getLine(); // Source line
14
+ public function getTrace(); // An array of the backtrace()
15
+ public function getTraceAsString(); // Formated string of trace
16
+
17
+ /* Overrideable methods inherited from Exception class */
18
+ public function __toString(); // formated string for display
19
+ public function __construct($message = null, $code = 0);
20
+ }
21
+
22
+
23
+ class VzaarException extends Exception implements IException {
24
+
25
+ public function __construct($message = null, $code = 0) {
26
+ if (!$message) {
27
+ throw new $this('Unknown '. get_class($this));
28
+ }
29
+ parent::__construct($message, $code);
30
+ }
31
+
32
+ public function __toString() {
33
+ return "exception '".__CLASS__ ."' with message '".$this->getMessage()."' in ".$this->getFile().":".$this->getLine()."\nStack trace:\n".$this->getTraceAsString();
34
+ }
35
+ }
lib/Vzaar/index.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* Vzaar API Implementation
3
+ * Works for public API and OAuth both
4
+ * All methods listed till today (October 29, 2009) - fully supported
5
+ *
6
+ *
7
+ * In order to use OAuth based API please make sure you've generated your own
8
+ * token. All samples in /test folder provided just for the reference.
9
+ *
10
+ * This PHP implementation been tested under Linux/Apache and Windows/IIS both.
11
+ *
12
+ * @author skitsanos
13
+ * @version 1.4
14
+ */
15
+
16
+ require_once 'Vzaar.php';
17
+ require_once 'User.php';
18
+ require_once 'Video.php';
19
+ require_once 'VideoList.php';
20
+ require_once 'AccountType.php';
21
+
22
+ //require_once 'HttpRequest1.php';
23
+
24
+ /**
25
+ * This API call returns the user's public details along with it's relevant metadata
26
+ */
27
+ Vzaar::$token = 'b9jAGJGIz7MFPj7zgVvIEZiyQPEAMdo0PKjoJtiO9bI'; //
28
+ Vzaar::$secret = 'hashid';
29
+
30
+ date_default_timezone_set("Europe/London");
31
+
32
+ /**
33
+ * Public API
34
+ */
35
+ //var_dump(Vzaar::getVideoDetails(17069));
36
+ //var_dump(Vzaar::getVideoDetails(36356, true));
37
+ //var_dump(Vzaar::getAccountDetails(1));
38
+ //var_dump(Vzaar::getVideoList('skitsanos', false, 2));
39
+ //var_dump(Vzaar::getVideoList('skitsanos', true, 10));
40
+ //var_dump(Vzaar::searchVideoList('skitsanos', 'true', 's3'));
41
+ //var_dump(Vzaar::getUserDetails('skitsanos'));
42
+ //var_dump(Vzaar::getVideoDetails(21791,true));
43
+ //var_dump(Vzaar::getUploadSignature());
44
+
45
+ //print_r(Vzaar::getVideoDetails(632017, true));
46
+
47
+ /**
48
+ * OAuth API
49
+ */
50
+ //print_r(Vzaar::whoAmI());
51
+ //var_dump(Vzaar::searchVideoList('skitsanos', true));
52
+ //print_r(Vzaar::getVideoList('skitsanos', true, 2, 'skitsanos%20tv'));
53
+ //print_r(Vzaar::getVideoDetails(324763, true)->html);
54
+
55
+ print_r(Vzaar::editVideo(434506, 'My Video tv Title', 'Some amazing description', 'true', 'http://skitsanos.tv/content/746959'));
56
+ //print_r(Vzaar::deleteVideo(746959));
57
+ ?>
package.xml ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Retailon_Vzaar</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://opensource.org/licenses/MIT">MIT</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Connect your Vzaar account and Magento store! Show your Vzaar videos on product pages in a few clicks!</summary>
10
+ <description>This extension for Magento helps an admin to connect to his/her Vzaar account.&#xD;
11
+ &#xD;
12
+ The videos can be fetched from vzaar account directly. They can be watched from the backend, assigned to products and categories so that they come up on Product pages.&#xD;
13
+ &#xD;
14
+ The videos can be played in a jQuery Lightbox or Inline, i.e inside the image box.&#xD;
15
+ &#xD;
16
+ This extension is built by RetailOn Inc, a fast growing Magento Company. Visit www.retailon.net to learn more.&#xD;
17
+ &#xD;
18
+ To learn more about Vzaar, visit www.vzaar.com</description>
19
+ <notes>This extension was developed and tested on Magento 1.8. However it should work on all versions later than 1.5</notes>
20
+ <authors><author><name>Hashid Hameed</name><user>hashid</user><email>hashid@retailon.in</email></author></authors>
21
+ <date>2014-03-13</date>
22
+ <time>05:52:50</time>
23
+ <contents><target name="magecommunity"><dir name="Retailon"><dir name="Vzaar"><dir name="Block"><dir name="Adminhtml"><dir name="Alpha"><file name="Grid.php" hash="8bdce7446cd196c27f6e29fc72c65425"/></dir><file name="Alpha.php" hash="3d6f2272484855269d324748d5d2c9c3"/><file name="Renderer.php" hash="72dc930425a95a6f7b6558a190aa7554"/></dir><dir name="Product"><dir name="View"><file name="Media.php" hash="03428205de43c83fac0351de2263354f"/></dir><file name="View.php" hash="e6a0c028c07d73e22f425c8ad8c0d720"/></dir><file name="Videolist.php" hash="caab4d5cc2a9236eb852536a81583087"/></dir><dir name="Helper"><file name="Data.php" hash="70ea0a12415a025aeed3b9b5669332b7"/></dir><dir name="Model"><dir name="Entity"><dir name="Attribute"><dir name="Source"><dir name="Table"><file name="Videos.php" hash="9f12773794c975454880aa8b552d55bd"/></dir></dir></dir></dir><file name="Observer.php" hash="3e2a88861f4643c058eec09daad550dc"/><dir name="Resource"><file name="Setup.php" hash="619c105c2f98378506d075a18b3279b4"/><dir name="Vzaarlist"><file name="Collection.php" hash="c6336cc63a924827261e3c51e550803a"/></dir><file name="Vzaarlist.php" hash="d91052e1a4c97f5bba0ee07cbdf3ce4b"/></dir><dir name="Videoplayer"><file name="Displaystyle.php" hash="ce501c5a8f6b365b2b7f1780e88885b5"/></dir><file name="Vzaarlist.php" hash="3e6f554f80d497a6b256c5c4e1144c01"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="IndexController.php" hash="738446230e28714b29eec1122f413b42"/></dir><file name="IndexController.php" hash="367380bb9b43c1be4528470ca576349c"/></dir><dir name="etc"><file name="config.xml" hash="e5c1195dc078cc1c455873161e26c22b"/><file name="system.xml" hash="ccc3804ffebffd11c0659c299027b43e"/></dir><dir name="sql"><dir name="vzaar_setup"><file name="mysql4-install-1.0.0.php" hash="c6aa547093574439b53df232b11d7613"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="vzaaradmin.xml" hash="9fd7d02d1cf2245a06edce4f059ecdf5"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="retailonvzaar.xml" hash="0b8ec404dd489a0af1682505cbd1957c"/></dir><dir name="template"><dir name="retailonvzaar"><file name="view.phtml" hash="c7c46b8ac0d68db6a8033ed6a0571821"/></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="Vzaar"><file name="AccountType.php" hash="0f4151125d5e03d852830bc0b7ed0000"/><file name="HttpRequest1.php" hash="4285dd0c4c12bffbc2cefda1f5a6b643"/><file name="OAuth.php" hash="2f7b4077562f7b65f170d2643f378246"/><file name="UploadSignature.php" hash="6a7f70331e6b22bcbc2452ff7b2c8876"/><file name="User.php" hash="56e34b0fb371d9e0345942e08795896d"/><file name="Video.php" hash="9b0f35fff9db710ad3366624dcad2caf"/><file name="VideoDetails.php" hash="2723315faf69b01713451563d2d46d68"/><file name="VideoList.php" hash="0085d50ee4a5c5c66645fb551faa64ea"/><file name="Vzaar.php" hash="3e990df73fbf36f53d68e208ecafcf65"/><file name="VzaarException.php" hash="c7de74b75fabd84f83b2d8ea67942a26"/><file name="index.php" hash="bb1fad15061990293c3ea7d68bc9daba"/></dir></target><target name="mageweb"><dir name="js"><dir name="vzaar"><file name="blank.gif" hash="325472601571f31e1bf00674c368d335"/><file name="fancybox_loading.gif" hash="328cc0f6c78211485058d460e80f4fa8"/><file name="fancybox_loading@2x.gif" hash="f92938639fa894a0e8ded1c3368abe98"/><file name="fancybox_overlay.png" hash="77aeaa52715b898b73c74d68c630330e"/><file name="fancybox_sprite.png" hash="783d4031fe50c3d83c960911e1fbc705"/><file name="fancybox_sprite@2x.png" hash="ed9970ce22242421e66ff150aa97fe5f"/><file name="jquery.fancybox.css" hash="6c55951ce1e3115711f63f99b7501f3a"/><file name="jquery.fancybox.pack.js" hash="cc9e759f24ba773aeef8a131889d3728"/><file name="jquery.min.js" hash="9dcde2d5e8aeda556a0c52239fa2f44c"/><file name="vzaar.js" hash="55b369d527a1693cd7816fa5ef4d79d1"/></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Retailon_Vzaar.xml" hash="dd01d422896b482436d4d27770d3c9c9"/></dir></target></contents>
24
+ <compatible/>
25
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php><package><name>Mage_Core_Modules</name><channel>community</channel><min>1.5</min><max>1.9</max></package></required></dependencies>
26
+ </package>