[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln    merge=union\n*.csproj merge=union\n*.vbproj merge=union\n*.fsproj merge=union\n*.dbproj merge=union\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n\n# External tool builders\n.externalToolBuilders/\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n\n#################\n## Visual Studio\n#################\n\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n\n[Dd]ebug/\n[Rr]elease/\nx64/\nbuild/\n[Bb]in/\n[Oo]bj/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.log\n*.scc\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n*.ncrunch*\n.*crunch*.local.xml\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.Publish.xml\n*.pubxml\n\n# NuGet Packages Directory\n## TODO: If you have NuGet Package Restore enabled, uncomment the next line\n#packages/\n\n# Windows Azure Build Output\ncsx\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\nsql/\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.[Pp]ublish.xml\n*.pfx\n*.publishsettings\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\nApp_Data/*.mdf\nApp_Data/*.ldf\n\n#############\n## Windows detritus\n#############\n\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Mac crap\n.DS_Store\n\n\n#############\n## Python\n#############\n\n*.py[co]\n\n# Packages\n*.egg\n*.egg-info\ndist/\nbuild/\neggs/\nparts/\nvar/\nsdist/\ndevelop-eggs/\n.installed.cfg\n\n# Installer logs\npip-log.txt\n\n# Unit test / coverage reports\n.coverage\n.tox\n\n#Translations\n*.mo\n\n#Mr Developer\n.mr.developer.cfg\n"
  },
  {
    "path": "README.md",
    "content": "# WebIM说明\nWebIM是一款基于jQuery的一款web即时通讯插件，姑且这么称呼吧。插件最大程度实现了IM的常用功能，除即时通讯的常用功能外，还加入了：消息盒子、窗口抖动、添加删除好友、最近联系人、超时登录界面、网站小秘书、聊天记录、发送频率限制、发送产品、发送名片、发送表情、产品分享、黑名单、举报、收藏、公告、智能网址过滤、消息提醒、修改资料、名片二维码、禁止粘贴、收起联系人列表、推荐好友等30余项改进。全浏览器兼容。\n插件调用简单方便，只需在现有的web系统中加入几行代码，理论上可嵌入任何web系统。\n\n2012年项目，已不再维护。\n\n## 截图\n\n![webim](https://github.com/Beau-zihan/WebIM/blob/master/webim-preview.png)\n\n## 配置\n<pre>$(function() {\n         $(document).FnWebIM({\n             autoLogin          :true,       //boolean型，默认是否自动登录，true：自动登录，false：手动登录，默认为true\n             msgRefreshTime     :1000,       //number型，消息刷新时间，单位为ms\n             friendRefreshTime :10000,      //number型，好友刷新时间，单位为ms\n             showSecretary     :true,       //boolean型，默认是否显示小秘书，true：显示，false：不显示，默认为true\n             noticeContent     :\"唐僧师徒历经千辛万苦，终于见到了佛祖……\",        //string型，公告内容 为空时不显示公告\n             sendPicture       :true,       //boolean型，是否允许发送图片，true：允许，false：不允许，默认为true\n             msgMaxSize        :300,        //number型，单条消息最大允许字符\n             msgSound          :false,      //boolean型，是否开启声音提醒，true：开启，false:关闭，默认为true\n             defaultWindow     :\"\"          //string型，登录后打开新聊天窗口，此处接收的参数为联系人的uid，否则会出错\n         });\n    });</pre>\n\n## 详细说明文档\nhttp://www.zi-han.net/case/im/help.html\n\n## 示例\nhttp://www.zi-han.net/developer/721.html\n\n##注意\n请在服务器（如localhost）环境下打开\n"
  },
  {
    "path": "ajax/card.html",
    "content": "<dl class=\"im_contactcard\">\r\n    <dt><b>郑子涵</b> 先生 <span>技术部</span> | <i>前端开发</i> <a href=\"#\" target=\"_blank\"  title=\"实名认证\"></a><!--已认证：class=\"approve\"--></dt>\r\n    <dd class=\"mobile\">手机：<i>18693179452</i></dd>\r\n    <dd class=\"phone\">电话：<i>09318976086</i></dd>\r\n    <dd class=\"fax\">传真：<i>09318976086</i></dd>\r\n    <dd class=\"address\">地址：<i>甘肃兰州市城关区庆阳路世纪广场A座1708</i></dd>\r\n    <dd class=\"zipcode\">邮编：<i>730030</i></dd>\r\n    <dd class=\"website\">网址：<i>http://www.zi-han.net/</i></dd>\r\n</dl>\r\n<style type=\"text/css\">\r\n    .im_contactcard{line-height: 20px;float: left;width:300px;margin-bottom:10px; }\r\n    .im_contactcard dt{border-bottom: dashed 1px #ddd;margin-bottom: 10px;padding-bottom:10px;}\r\n    .im_contactcard dt a{display: inline-block;width:16px;height:14px; background: url(../img/cinfo_icon.png) no-repeat;position:absolute;margin:10px 0 0 10px; *margin:14px 0 0 5px;}\r\n    .im_contactcard dt a.approve{background-position:-18px 0; }\r\n    .im_contactcard dt b{font-size:24px;font-weight: bold;color:#000;font-weight:normal;margin-right:10px;font-family: \"microsoft yahei\"; }\r\n    .im_contactcard i{font-style: normal;color:#666 !important;}\r\n    .im_contactcard h4{line-height: 40px;border-bottom: dashed 1px #ddd;font-size: 14px;margin-bottom:10px;}\r\n    .im_contactcard h4 a{font-size: 12px;}\r\n    .im_mycard{padding:15px 20px;border:solid 1px #b7b7b7;border-top:solid 2px #000;width:300px;margin:5px 0;background: #fff;}\r\n    .im_mycard a.cc{color:#999;text-decoration: none;padding-left:15px;margin-right:10px;}\r\n    .im_mycard a.cc:hover{text-decoration: underline;color:#666;}\r\n    .im_mycard a.cc.atocard{background: url(\"../img/product_ico.png\") no-repeat 0 -165px;}\r\n    .im_mycard a.cc.atocard:hover{background-position: 0 -188px;}\r\n    .im_mycard a.cc.aqrcode{background: url(\"../img/product_ico.png\") no-repeat 0 -118px;}\r\n    .im_mycard a.cc.aqrcode:hover{background-position:  0 -142px;}\r\n</style>"
  },
  {
    "path": "ajax/chats.php",
    "content": "[\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"你们带U盘了么？\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"<img src='face/qq/26.gif' />\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"那你们就原路回去吧，我用QQ传给你们！\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"<img src='face/qq/36.gif' />早知道加你QQ就完了，老子还走这么远干嘛啊\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"你们以为要加就加啊，我经常隐身滴！最后，如来还来句：你们有没psp啊？\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"……\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"那这么远的路，你们是怎么娱乐的？\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"打怪升级……\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"<em>唐僧师徒按原路返回……</em>\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"<em>经书传输中……</em>\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"怎么这么慢呢，你什么网啊？\"},\r\n  {\"T\": \"0\",\"D\": \"6-11 12:12:23\",\"M\": \"单位的网……\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"……你再来一趟吧，带上U盘\"},\r\n  {\"T\": \"1\",\"D\": \"6-11 12:12:23\",\"M\": \"来张图片试试！<img src='http://www.google.com.hk/logos/2012/shot_put-2012-hp.jpg' />\"}\r\n]"
  },
  {
    "path": "ajax/companyinfo.html",
    "content": "<div class=\"im_suppliersinfo\">\r\n    <dl>\r\n        <dt>生财通指数：</dt>\r\n        <dd><i>120</i></dd>\r\n    </dl>\r\n    <dl>\r\n        <dt>工商注册：</dt>\r\n        <dd>\r\n            <a href=\"#\" class=\"ccompany\" title=\"已认证\"></a>\r\n            <a href=\"#\" class=\"vcompany\" title=\"未认证\"></a>\r\n        </dd>\r\n    </dl>\r\n    <dl class=\"bordotted\">\r\n        <dt>个人身份：</dt>\r\n        <dd>\r\n            <a href=\"#\" class=\"cmail\" title=\"实名认证\"></a>\r\n            <!--<a href=\"#\" class=\"vmail\" title=\"实名认证\"></a>-->\r\n            <!--<a href=\"#\" class=\"cmobile\" title=\"邮箱认证\"></a>-->\r\n            <a href=\"#\" class=\"vmobile\" title=\"邮箱认证\"></a>\r\n            <!--<a href=\"#\" class=\"cname\" title=\"手机认证\"></a>-->\r\n            <a href=\"#\" class=\"vname\" title=\"手机认证\"></a>\r\n        </dd>\r\n    </dl>\r\n    <dl>\r\n        <dt>联&nbsp;系&nbsp;&nbsp;人：</dt>\r\n        <dd>\r\n            <a href=\"#\">郑子涵</a>\r\n        </dd>\r\n    </dl>\r\n    <dl>\r\n        <dt>经营模式：</dt>\r\n        <dd>生产厂家</dd></dl>\r\n    <dl>\r\n        <dt>所在地区：</dt>\r\n        <dd>甘肃 兰州市</dd>\r\n    </dl>\r\n    <dl class=\"bordotted\">\r\n        <dt>特殊荣誉：</dt>\r\n        <dd><a href=\"#\" class=\"tuiguang\"></a></dd>\r\n    </dl>\r\n    <dl>\r\n        <dt>注册时间：</dt>\r\n        <dd>2008年12月12日</dd>\r\n    </dl>\r\n    <dl class=\"bordotted\">\r\n        <dt>最后登录：</dt>\r\n        <dd>最近一周内登录过</dd>\r\n    </dl>\r\n    <p><a href=\"javascript:;\" class=\"im_companyFav\">收藏公司</a><span>共被收藏 4 次</span></p>\r\n</div>\r\n<style type=\"text/css\">\r\n    *{padding:0;margin:0;}\r\n    body{font-size:12px;}\r\n    .im_suppliersinfo{background:#fff;padding:10px;float: left;width:180px;}\r\n    .im_suppliersinfo dl{line-height: 22px;width:100%;float: left;}\r\n    .im_suppliersinfo dl dt{ color: #444;width:6em;float: left;}\r\n    .im_suppliersinfo dl dd{float: left;}\r\n    .im_suppliersinfo i{font-style: normal; color: #06c;}\r\n    .bordotted{ border-bottom: dotted 1px #ddd;padding-bottom:6px;margin-bottom: 6px;}\r\n    .im_suppliersinfo p{float: left;width:100%;padding-top:5px; text-align: center;}\r\n    .im_suppliersinfo p a{display: inline-block;width:71px;height:21px;line-height: 21px; background: url(../img/favc_btn.png) no-repeat; text-align: center;color:#666;text-decoration: none;}\r\n    .im_suppliersinfo p a:hover{background: url(../img/favc_btn.png) no-repeat 0 bottom;color:#333;}\r\n    .im_suppliersinfo p span{color:#666; margin-left:10px;}\r\n    a.ccompany,a.cmail,a.cmobile,a.cname,a.vcompany,a.vmail,a.vmobile,a.vname{float:left;width:16px;height:14px;background-image: url(\"../img/cinfo_icon.png\");background-repeat: no-repeat;margin:4px 3px 0 0;}\r\n    a.ccompany{background-position: 0 -35px;}\r\n    a.cmail{background-position: 0 -52px;}\r\n    a.cmobile{background-position: 0 -18px;}\r\n    a.cname{background-position:0 0;}\r\n    a.vcompany{background-position: -18px -35px;}\r\n    a.vmail{background-position:  -18px -52px;}\r\n    a.vmobile{background-position:  -18px -18px;}\r\n    a.vname{background-position:  -18px 0;}\r\n    a.tuiguang{display:inline-block;width:57px; height:16px; background: url(../img/serviceico.png) no-repeat;margin:3px 5px 0 0;}\r\n</style>"
  },
  {
    "path": "ajax/friends.html",
    "content": "<div class=\"im_friendsbox\">\r\n    <dl>\r\n        <dt uid=\"\"><img src=\"../temp/1.jpg\" width=\"30\" height=\"30\" /></dt>\r\n        <dd class=\"im_msgdetail\">\r\n            <p>\r\n                <a href=\"#\" class=\"im_companyname\" target=\"_blank\">淄博林华商贸有限公司</a>\r\n                <a href=\"#\" class=\"ccompany\" title=\"已认证\"></a>\r\n                <!--<a href=\"#\" class=\"vcompany\" title=\"未认证\"></a>-->\r\n            </p>\r\n            <p>\r\n                <a href=\"javascript:;\" class=\"im_friendname\" target=\"_blank\" uid=\"\">小米</a>\r\n                <a href=\"#\" class=\"cmail\" title=\"实名认证\"></a>\r\n                <!--<a href=\"#\" class=\"vmail\" title=\"实名认证\"></a>-->\r\n                <!--<a href=\"#\" class=\"cmobile\" title=\"邮箱认证\"></a>-->\r\n                <!--<a href=\"#\" class=\"vmobile\" title=\"邮箱认证\"></a>-->\r\n                <!--<a href=\"#\" class=\"cname\" title=\"手机认证\"></a>-->\r\n                <!--<a href=\"#\" class=\"vname\" title=\"手机认证\"></a>-->\r\n            </p>\r\n        </dd>\r\n        <dd class=\"im_msginfo\">\r\n            <a href=\"javascript:;\" class=\"im_addcontact\">加为好友</a>\r\n        </dd>\r\n    </dl>\r\n    <dl>\r\n        <dt  uid=\"\"><img src=\"../temp/3.jpg\" width=\"30\" height=\"30\" /></dt>\r\n        <dd class=\"im_msgdetail\">\r\n            <p>\r\n                <a href=\"#\" class=\"im_companyname\" target=\"_blank\">东阳市东彩服饰辅料有限公司</a>\r\n                <a href=\"#\" class=\"ccompany\" title=\"已认证\"></a>\r\n                <!--<a href=\"#\" class=\"vcompany\" title=\"未认证\"></a>-->\r\n            </p>\r\n            <p>\r\n                <a href=\"javascript:;\" class=\"im_friendname\" target=\"_blank\"  uid=\"\">小米</a>\r\n                <a href=\"#\" class=\"cmail\" title=\"实名认证\"></a>\r\n                <!--<a href=\"#\" class=\"vmail\" title=\"实名认证\"></a>-->\r\n                <a href=\"#\" class=\"cmobile\" title=\"邮箱认证\"></a>\r\n                <!--<a href=\"#\" class=\"vmobile\" title=\"邮箱认证\"></a>-->\r\n                <a href=\"#\" class=\"cname\" title=\"手机认证\"></a>\r\n                <!--<a href=\"#\" class=\"vname\" title=\"手机认证\"></a>-->\r\n            </p>\r\n        </dd>\r\n        <dd class=\"im_msginfo\">\r\n            <a href=\"javascript:;\" class=\"im_addcontact\">加为好友</a>\r\n        </dd>\r\n    </dl>\r\n    <dl>\r\n        <dt><img src=\"../temp/5.jpg\" width=\"30\" height=\"30\" /></dt>\r\n        <dd class=\"im_msgdetail\">\r\n            <p>\r\n                <a href=\"#\" class=\"im_companyname\" target=\"_blank\">苍南县君越工艺品有限公司</a>\r\n                <a href=\"#\" class=\"ccompany\" title=\"已认证\"></a>\r\n                <!--<a href=\"#\" class=\"vcompany\" title=\"未认证\"></a>-->\r\n            </p>\r\n            <p>\r\n                <a href=\"javascript:;\" class=\"im_friendname\" target=\"_blank\">小米</a>\r\n                <a href=\"#\" class=\"cmail\" title=\"实名认证\"></a>\r\n                <!--<a href=\"#\" class=\"vmail\" title=\"实名认证\"></a>-->\r\n                <a href=\"#\" class=\"cmobile\" title=\"邮箱认证\"></a>\r\n                <!--<a href=\"#\" class=\"vmobile\" title=\"邮箱认证\"></a>-->\r\n                <a href=\"#\" class=\"cname\" title=\"手机认证\"></a>\r\n                <!--<a href=\"#\" class=\"vname\" title=\"手机认证\"></a>-->\r\n            </p>\r\n        </dd>\r\n        <dd class=\"im_msginfo\">\r\n            <a href=\"javascript:;\" class=\"im_addcontact\">加为好友</a>\r\n        </dd>\r\n    </dl>\r\n</div>\r\n<style type=\"text/css\">\r\n    .im_friendsbox{width:410px;height:240px;overflow: hidden;}\r\n    .im_friendsbox dl{padding:10px 15px;line-height: 16px;width: 380px;height:33px;border-bottom: solid 1px #fafafa;}\r\n    .im_friendsbox dl:hover{background: #fcfcfc;}\r\n    .im_friendsbox dl a{display: block;float:left;color:#666;text-decoration: none;}\r\n    .im_friendsbox dl p{width: 268px;clear: both;}\r\n    .im_friendsbox dl a:hover{color:#333;text-decoration: none;}\r\n    .im_friendsbox dt,.im_friendsbox dd{float: left;}\r\n    .im_friendsbox dt{margin:3px 10px 0 0;cursor: pointer;}\r\n    .im_friendsbox dl a.im_companyname,.im_friendsbox dl a.im_friendname{margin-right:10px;}\r\n    a.ccompany,a.cmail,a.cmobile,a.cname,a.vcompany,a.vmail,a.vmobile,a.vname{float:left;width:16px;height:14px;background-image: url(\"../img/cinfo_icon.png\");background-repeat: no-repeat;margin:3px 3px 0 0;}\r\n    a.ccompany{background-position: 0 -35px;}\r\n    a.cmail{background-position: 0 -52px;}\r\n    a.cmobile{background-position: 0 -18px;}\r\n    a.cname{background-position:0 0;}\r\n    a.vcompany{background-position: -18px -35px;}\r\n    a.vmail{background-position:  -18px -52px;}\r\n    a.vmobile{background-position:  -18px -18px;}\r\n    a.vname{background-position:  -18px 0;}\r\n    .im_friendsbox dl a.im_addcontact{width:71px;height:21px;line-height:21px; text-align:center;margin-top:4px;background: url(\"../img/favc_btn.png\") no-repeat;}\r\n    .im_friendsbox dl a.im_addcontact:hover{background-position: 0 bottom;}\r\n</style>"
  },
  {
    "path": "ajax/friends.php",
    "content": "[\r\n  {\"RencentContacts\":\r\n    [\r\n        {\"a\": \"../img/noavatar_s.png\",\"n\": \"阳光般闪耀\",\"o\": \"online\",\"uid\": \"001\",\"h\":\"\", \"m\":0},\r\n        {\"a\": \"../temp/1.jpg\",\"n\": \"小米\",\"o\": \"online\",\"uid\": \"002\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/2.jpg\",\"n\": \"安卓-关龙飞\",\"o\": \"online\",\"uid\": \"003\",\"h\": \"\", \"m\":1},\r\n        {\"a\": \"../temp/3.jpg\",\"n\": \"诚信办证\",\"o\": \"online\",\"uid\": \"004\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/4.jpg\",\"n\": \"业务--小张\",\"o\": \"offline\",\"uid\": \"005\",\"h\": \"\", \"m\":3},\r\n        {\"a\": \"../temp/5.jpg\",\"n\": \"诚信办证\",\"o\": \"offline\",\"uid\": \"006\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/6.jpg\",\"n\": \"业务--小张\",\"o\": \"offline\",\"uid\": \"007\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/7.jpg\",\"n\": \"诚信办证\",\"o\": \"offline\",\"uid\": \"008\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/8.jpg\",\"n\": \"业务--小张\",\"o\": \"offline\",\"uid\": \"009\",\"h\": \"\", \"m\":0}\r\n    ],\r\n    \"Friends\": [\r\n        {\"a\": \"../temp/9.jpg\",\"n\": \"诚信办证\",\"o\": \"online\",\"uid\": \"010\",\"h\": \"\", \"m\":1},\r\n        {\"a\": \"../img/noavatar_s.png\",\"n\": \"业务--小张\",\"o\": \"online\",\"uid\": \"011\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/10.jpg\",\"n\": \"关龙飞\",\"o\": \"offline\",\"uid\": \"012\",\"h\": \"\", \"m\":0},\r\n        {\"a\": \"../temp/11.jpg\",\"n\": \"小米\",\"o\": \"offline\",\"uid\": \"013\",\"h\": \"\", \"m\":0}\r\n    ],\r\n    \"RencentContactsOnline\":5,\r\n    \"FriendsOnline\":2\r\n  }\r\n]"
  },
  {
    "path": "ajax/im_contact.html",
    "content": "<div class=\"im_top\">\r\n    <a href=\"javascript:;\" class=\"cc\"></a>\r\n    <h4>在线聊天工具 </h4>\r\n    <a href =\"javascript:;\" title=\"消息盒子\" class=\"modify\">&nbsp;</a>\r\n</div>\r\n<div class=\"im_contents\">\r\n    <div class=\"im_contact_group\">\r\n        <h4 class=\"im_group_expansion\" >最近联系人<i></i></h4>\r\n        <div class=\"im_group_contacts im_contacts\" id=\"imRencentContacts\">\r\n        </div>\r\n        <h4 class=\"im_group_away\" >我的好友<i></i></h4>\r\n        <div class=\"im_group_contacts im_friends hide\" id=\"imFriends\">\r\n        </div>\r\n    </div>\r\n</div>\r\n<div class=\"im_bottombar\">\r\n    <input type=\"text\" value=\"查找联系人\" x-webkit-speech speech />\r\n    <span></span>\r\n    <ul>\r\n        <!--<li class=\"selected smssub\">短信提醒</li>-->\r\n        <!--<li class=\"selected\">只显示在线联系人</li>-->\r\n        <!--<li class=\"selected current\">开启声音提示</li>-->\r\n        <!--<li class=\"selected current\">接收陌生人信息</li>-->\r\n        <!--<li class=\"selected current\">自动登录</li>-->\r\n        <li class=\"setting\">修改个人资料</li>\r\n        <li class=\"backlist\">黑名单</li>\r\n        <li class=\"friends\">推荐好友</li>\r\n        <li class=\"help\">查看帮助</li>\r\n        <li class=\"loginout\">退出登录</li>\r\n    </ul>\r\n</div>\r\n"
  },
  {
    "path": "ajax/im_face.html",
    "content": "<ul>\r\n    <li class=\"current\">默认表情</li>\r\n    <li class=\"im_faceclose\">&times;</li>\r\n</ul>\r\n<div class=\"im_faceico\">\r\n    <a href=\"#\" title=\"微笑\" code=\"/01/\"><img src=\"../face/qq/01.gif\" /></a>\r\n    <a href=\"#\" title=\"色\" code=\"/02/\"><img src=\"../face/qq/02.gif\" /></a>\r\n    <a href=\"#\" title=\"发呆\" code=\"/03/\"><img src=\"../face/qq/03.gif\" /></a>\r\n    <a href=\"#\" title=\"得意\" code=\"/04/\"><img src=\"../face/qq/04.gif\" /></a>\r\n    <a href=\"#\" title=\"流泪\" code=\"/05/\"><img src=\"../face/qq/05.gif\" /></a>\r\n    <a href=\"#\" title=\"害羞\" code=\"/06/\"><img src=\"../face/qq/06.gif\" /></a>\r\n    <a href=\"#\" title=\"闭嘴\" code=\"/07/\"><img src=\"../face/qq/07.gif\" /></a>\r\n    <a href=\"#\" title=\"睡\" code=\"/08/\"><img src=\"../face/qq/08.gif\" /></a>\r\n    <a href=\"#\" title=\"撇嘴\" code=\"/09/\"><img src=\"../face/qq/09.gif\" /></a>\r\n    <a href=\"#\" title=\"大哭\" code=\"/10/\"><img src=\"../face/qq/10.gif\" /></a>\r\n    <a href=\"#\" title=\"发怒\" code=\"/11/\"><img src=\"../face/qq/11.gif\" /></a>\r\n    <a href=\"#\" title=\"调皮\" code=\"/12/\"><img src=\"../face/qq/12.gif\" /></a>\r\n    <a href=\"#\" title=\"呲牙\" code=\"/13/\"><img src=\"../face/qq/13.gif\" /></a>\r\n    <a href=\"#\" title=\"惊讶\" code=\"/14/\"><img src=\"../face/qq/14.gif\" /></a>\r\n    <a href=\"#\" title=\"难过\" code=\"/15/\"><img src=\"../face/qq/15.gif\" /></a>\r\n    <a href=\"#\" title=\"酷\" code=\"/16/\"><img src=\"../face/qq/16.gif\" /></a>\r\n    <a href=\"#\" title=\"冷汗\" code=\"/17/\"><img src=\"../face/qq/17.gif\" /></a>\r\n    <a href=\"#\" title=\"抓狂\" code=\"/18/\"><img src=\"../face/qq/18.gif\" /></a>\r\n    <a href=\"#\" title=\"吐\" code=\"/19/\"><img src=\"../face/qq/19.gif\" /></a>\r\n    <a href=\"#\" title=\"偷笑\" code=\"/20/\"><img src=\"../face/qq/20.gif\" /></a>\r\n    <a href=\"#\" title=\"可爱\" code=\"/21/\"><img src=\"../face/qq/21.gif\" /></a>\r\n    <a href=\"#\" title=\"白眼\" code=\"/22/\"><img src=\"../face/qq/22.gif\" /></a>\r\n    <a href=\"#\" title=\"傲慢\" code=\"/23/\"><img src=\"../face/qq/23.gif\" /></a>\r\n    <a href=\"#\" title=\"饥饿\" code=\"/24/\"><img src=\"../face/qq/24.gif\" /></a>\r\n    <a href=\"#\" title=\"困\" code=\"/25/\"><img src=\"../face/qq/25.gif\" /></a>\r\n    <a href=\"#\" title=\"惊恐\" code=\"/26/\"><img src=\"../face/qq/26.gif\" /></a>\r\n    <a href=\"#\" title=\"流汗\" code=\"/27/\"><img src=\"../face/qq/27.gif\" /></a>\r\n    <a href=\"#\" title=\"憨笑\" code=\"/28/\"><img src=\"../face/qq/28.gif\" /></a>\r\n    <a href=\"#\" title=\"大兵\" code=\"/29/\"><img src=\"../face/qq/29.gif\" /></a>\r\n    <a href=\"#\" title=\"奋斗\" code=\"/30/\"><img src=\"../face/qq/30.gif\" /></a>\r\n    <a href=\"#\" title=\"咒骂\" code=\"/31/\"><img src=\"../face/qq/31.gif\" /></a>\r\n    <a href=\"#\" title=\"疑问\" code=\"/32/\"><img src=\"../face/qq/32.gif\" /></a>\r\n    <a href=\"#\" title=\"嘘\" code=\"/33/\"><img src=\"../face/qq/33.gif\" /></a>\r\n    <a href=\"#\" title=\"晕\" code=\"/34/\"><img src=\"../face/qq/34.gif\" /></a>\r\n    <a href=\"#\" title=\"折磨\" code=\"/35/\"><img src=\"../face/qq/35.gif\" /></a>\r\n    <a href=\"#\" title=\"衰\" code=\"/36/\"><img src=\"../face/qq/36.gif\" /></a>\r\n    <a href=\"#\" title=\"骷髅\" code=\"/37/\"><img src=\"../face/qq/37.gif\" /></a>\r\n    <a href=\"#\" title=\"敲打\" code=\"/38/\"><img src=\"../face/qq/38.gif\" /></a>\r\n    <a href=\"#\" title=\"再见\" code=\"/39/\"><img src=\"../face/qq/39.gif\" /></a>\r\n    <a href=\"#\" title=\"擦汗\" code=\"/40/\"><img src=\"../face/qq/40.gif\" /></a>\r\n    <a href=\"#\" title=\"抠鼻\" code=\"/41/\"><img src=\"../face/qq/41.gif\" /></a>\r\n    <a href=\"#\" title=\"鼓掌\" code=\"/42/\"><img src=\"../face/qq/42.gif\" /></a>\r\n    <a href=\"#\" title=\"糗大了\" code=\"/43/\"><img src=\"../face/qq/43.gif\" /></a>\r\n    <a href=\"#\" title=\"坏笑\" code=\"/44/\"><img src=\"../face/qq/44.gif\" /></a>\r\n    <a href=\"#\" title=\"左哼哼\" code=\"/45/\"><img src=\"../face/qq/45.gif\" /></a>\r\n    <a href=\"#\" title=\"右哼哼\" code=\"/46/\"><img src=\"../face/qq/46.gif\" /></a>\r\n    <a href=\"#\" title=\"哈欠\" code=\"/47/\"><img src=\"../face/qq/47.gif\" /></a>\r\n    <a href=\"#\" title=\"鄙视\" code=\"/48/\"><img src=\"../face/qq/48.gif\" /></a>\r\n    <a href=\"#\" title=\"委屈\" code=\"/49/\"><img src=\"../face/qq/49.gif\" /></a>\r\n    <a href=\"#\" title=\"快哭了\" code=\"/50/\"><img src=\"../face/qq/50.gif\" /></a>\r\n    <a href=\"#\" title=\"阴险\" code=\"/51/\"><img src=\"../face/qq/51.gif\" /></a>\r\n    <a href=\"#\" title=\"亲亲\" code=\"/52/\"><img src=\"../face/qq/52.gif\" /></a>\r\n    <a href=\"#\" title=\"吓\" code=\"/53/\"><img src=\"../face/qq/53.gif\" /></a>\r\n    <a href=\"#\" title=\"可怜\" code=\"/54/\"><img src=\"../face/qq/54.gif\" /></a>\r\n    <a href=\"#\" title=\"啵一个\" code=\"/55/\"><img src=\"../face/qq/55.gif\" /></a>\r\n    <a href=\"#\" title=\"猪头\" code=\"/56/\"><img src=\"../face/qq/56.gif\" /></a>\r\n    <a href=\"#\" title=\"强\" code=\"/57/\"><img src=\"../face/qq/57.gif\" /></a>\r\n    <a href=\"#\" title=\"握手\" code=\"/58/\"><img src=\"../face/qq/58.gif\" /></a>\r\n    <a href=\"#\" title=\"胜利\" code=\"/59/\"><img src=\"../face/qq/59.gif\" /></a>\r\n    <a href=\"#\" title=\"OK\" code=\"/60/\"><img src=\"../face/qq/60.gif\" /></a>\r\n</div>\r\n<style type=\"text/css\">\r\n    #im_face ul{height:24px;line-height: 24px;background: #f7f7f7;padding:5px 5px 0 11px;}\r\n    #im_face ul li{float: left;padding:0 15px;list-style: none;cursor: pointer; color: #666;}\r\n    #im_face ul li.current{background: #fff;color:#c00;}\r\n    #im_face ul li.im_faceclose{float:right;line-height: 18px;padding:0 5px;font-size:16px;}\r\n    #im_face ul li.im_faceclose:hover{float:right;color:#c00;}\r\n    #im_face .im_faceico{margin:11px;background: #fff;}\r\n    #im_face .im_faceico a{display:block;width:24px;height:24px;border:solid 1px #dfe6f6;background:#fff;float: left;margin:-1px 0 0 -1px;padding:2px 2px 1px 2px;}\r\n    #im_face .im_faceico a:hover{background: #fafafa;}\r\n</style>\r\n"
  },
  {
    "path": "ajax/im_window.html",
    "content": "<div id=\"im_window\" >\r\n    <div id=\"im_body\">\r\n        <div class=\"im_chats\">\r\n\r\n            <a class=\"im_morechats\" href=\"javascript:;\">查看更多聊天记录</a>\r\n            <div class=\"im_chat_content\" style=\"display: none;\"></div>\r\n        </div>\r\n        <div class=\"im_send_msg\" contentEditable=\"true\"  onpaste=\"msgPaste();return false;\"></div>\r\n        <div class=\"im_operatebar\">\r\n            <div style=\"float: left;\">\r\n                <div id=\"im_face\"></div>\r\n                <div class=\"im_moreoperate\">\r\n                    <a class=\"im_abacklist\" href=\"javascript:;\" >加入黑名单</a>\r\n                    <a class=\"im_areport\" href=\"javascript:;\" >举报</a>\r\n                    <a class=\"im_aemptyrecords\" href=\"javascript:;\" >清空聊天记录</a>\r\n                    <a class=\"im_aclose\" href=\"javascript:;\" >&times;</a>\r\n                </div>\r\n            </div>\r\n            <a class=\"im_operates im_face\" href=\"javascript:;\" title=\"发送表情\"></a>\r\n            <a class=\"im_operates im_upload_pic\" href=\"javascript:;\" title=\"发送图片\"></a>\r\n            <a class=\"im_operates im_shake\" href=\"javascript:;\" title=\"发送窗口抖动\"></a>\r\n            <a class=\"im_operates im_product\" href=\"javascript:;\" title=\"发送产品\"></a>\r\n            <a class=\"im_operates im_card\" href=\"javascript:;\" title=\"发送名片\"></a>\r\n            <a class=\"im_operates im_moreoperates\" href=\"javascript:;\"  title=\"更多操作\"></a>\r\n\r\n            <a class=\"im_sendmsg_btn\" href=\"javascript:;\"></a>\r\n            <i>按Ctrl+回车键快速发送消息</i>\r\n        </div>\r\n    </div>\r\n    <div id=\"im_contactinfo\">\r\n        <div class=\"im_contactinfobar\">\r\n            <span>用户公司信息</span>\r\n            <a class=\"d-close\" href=\"javascript:;\"></a>\r\n        </div>\r\n        <div class=\"im_contactinfos\">\r\n\r\n        </div>\r\n        <div class=\"im_operatebars\">\r\n            <a class=\"im_contactgohome\" href=\"#\" target=\"_blank\">访问公司首页</a>\r\n        </div>\r\n    </div>\r\n</div>\r\n"
  },
  {
    "path": "ajax/login.html",
    "content": "<div class=\"input-prepend\">\r\n    <span class=\"add-on\">用户名:</span>\r\n    <input class=\"logintxt\" type=\"text\" size=\"20\">\r\n</div>\r\n<div class=\"input-prepend\">\r\n    <span class=\"add-on\">密码:</span>\r\n    <input class=\"logintxt\" type=\"password\" size=\"20\">\r\n</div>\r\n<div class=\"input-prepend\">\r\n    <span class=\"add-on\">验证码:</span>\r\n    <input class=\"logintxt\" type=\"text\" size=\"7\">\r\n    <img class=\"safecode\" title=\"换一张\" src=\"http://login.sina.com.cn/cgi/pin.php?r=20005262&s=0&p=0e3d5b9828d7d564dfbb48471161bcfe511c\" height=\"28\">\r\n</div>\r\n<div class=\"input-prepend\"><a href=\"#\" target=\"_blank\">注册新账户</a> <a href=\"#\" target=\"_blank\">忘记密码？</a></div>\r\n<style type=\"text/css\">\r\n    .input-prepend{clear:both;padding:7px 25px;height:18px;color: #333333;font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size: 12px;line-height: 18px;}\r\n    .add-on{width: 4em;text-align: right;display: block;float: left;border-radius: 2px 0 0 2px;margin-right: -1px;background-color: #fafafa;border: 1px solid #CCCCCC;font-weight: normal;height: 18px;line-height: 18px;min-width: 16px;padding: 4px 5px;text-shadow: 0 1px 0 #FFFFFF;vertical-align: middle;}\r\n    .logintxt{float: left;border-radius: 0 2px 2px 0;margin-left: 0;margin-bottom: 0;-moz-transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;border: 1px solid #CCCCCC;font-size: 13px;height: 18px;line-height: 18px;padding: 4px;font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;}\r\n    .input-prepend a{line-height:28px;float: left;margin-left:10px;text-decoration: none;}\r\n    input:focus{border-color: rgba(82, 168, 236, 0.8); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset, 0px 0px 8px rgba(82, 168, 236, 0.6); outline: 0px none;}\r\n    .input-prepend .safecode{margin:0 0 0 8px;cursor: pointer;float: left;}\r\n</style>"
  },
  {
    "path": "ajax/msgbox.html",
    "content": "<div class=\"im_msgboxs\" id=\"im_msgboxs\" style=\"height:240px;\">\r\n    <dl class=\"im_msgbox\">\r\n        <dt class=\"uid\"><img src=\"../temp/1.jpg\" width=\"30\" height=\"30\" /></dt>\r\n        <dd class=\"im_msgdetail\">\r\n            <p><a href=\"#\" target=\"_blank\">淄博林华商贸有限公司</a> - <a href=\"javascript:;\" class=\"msg_contact\" uid=\"90942834902\">小麦</a></p>\r\n            <p>对方发送了一张名片给您…… </p>\r\n        </dd>\r\n        <dd class=\"im_msginfo\"  uid=\"0980924\"><b title=\"查看消息\">37</b>7-18</dd>\r\n    </dl>\r\n    <dl class=\"im_msgbox\">\r\n        <dt class=\"uid\"><img src=\"../img/avatar_s-sys.png\" width=\"30\" height=\"30\" /></dt>\r\n        <dd class=\"im_msgdetail\">\r\n            <p><a href=\"#\" target=\"_blank\">系统小秘书</a></p>\r\n            <p>您的账户存在异常，请及时修改密码！</p>\r\n        </dd>\r\n        <dd class=\"im_msginfo\"  uid=\"0980924\"><b title=\"查看消息\">37</b>7-18</dd>\r\n    </dl>\r\n</div>\r\n<style type=\"text/css\">\r\n    dl.im_msgbox{padding:10px;line-height: 14px;width: 420px;font-family:tahoma,arial,\\5b8b\\4f53;-moz-user-select: none;border-bottom: solid 1px #fafafa;height:33px;clear: both;}\r\n    dl.im_msgbox:hover{background: #fcfcfc;}\r\n    dl.im_msgbox a{color:blue;text-decoration: none;}\r\n    dl.im_msgbox a:hover{text-decoration:underline;}\r\n    dl.im_msgbox dt{margin-right:10px;cursor: pointer;float: left;}\r\n    dl.im_msgbox dd{color:#999;float: left;}\r\n    dl.im_msgbox dd.im_msgdetail{width:300px;}\r\n    dl.im_msgbox dd.im_msginfo{width: 80px;text-align: right;padding-top:8px;}\r\n    dl.im_msgbox dd b{padding:0 5px;margin-left:10px;background: #c00;color:#fff;margin-right:10px;-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;font-weight: normal;line-height: 12px;overflow: hidden;cursor: pointer;}\r\n</style>"
  },
  {
    "path": "ajax/product.html",
    "content": "<div class=\"im_productbox\">\r\n    <a href=\"javascript:;\" class=\"im_product_img\">\r\n        <img src=\"http://www.zghnyb.com/userfiles/image/20120417144524.jpg\" alt=\"产品\"/>\r\n    </a>\r\n    <p class=\"im_product_info\">\r\n        <a href=\"#\" target=\"_blank\" class=\"im_product_name\">固定一体功能型超声波流量计</a>\r\n        <span class=\"im_product_a\"><a href=\"#\" target=\"_blank\" class=\"im_product_go\">去看看</a>\r\n            <a href=\"javascript:;\" class=\"im_product_favorites\">加入收藏</a>\r\n            <a href=\"javascript:;\" class=\"im_product_share\">分享</a>\r\n        </span>\r\n        <a href=\"#\" target=\"_blank\" class=\"im_product_more\">+ 更多同类产品</a>\r\n    </p>\r\n</div>\r\n<style type=\"text/css\">\r\n    .im_productbox{width: 380px;background: #fcfcfc; padding: 3px 10px;float: left;margin:3px -10px;_margin:3px -5px;min-height: 68px;}\r\n    .im_productbox:hover{background: #fffcec;}\r\n    .im_productbox a{text-decoration:none;}\r\n    .im_productbox a:hover{text-decoration:underline;}\r\n    .im_product_img{float:left;margin-right:10px;background:#fff;border:solid 1px #ddd;display:table-cell;overflow:hidden;text-align:center;line-height:0.94;vertical-align:middle;*display:block;font-size:54px;/**约为line-height*0.875**/width:66px;height:66px;}\r\n    .im_product_img:hover{border-color:#aaa;}\r\n    .im_product_img img{max-width: 66px;max-height: 66px;vertical-align: middle;_width:expression(this.width >66 && this.height <= this.width ? 66: true); _height:expression(this.height > 66 && this.width <= this.height ? 66 : true);}\r\n    .im_product_name{display: block;}\r\n    .im_product_info{float: left; }\r\n    .im_product_a{ width: 100%; display: block; color: #6e737b; font-size: 12px;padding-top:5px;}\r\n    .im_product_a a{margin-right:10px; padding:2px 0 2px 17px;color:#999;}\r\n    .im_product_a a.im_product_go{background: url(\"../img/product_ico.png\") 0 2px no-repeat;padding-left:13px;}\r\n    .im_product_favorites{background: url(\"../img/product_ico.png\") 0 -38px no-repeat;}\r\n    .im_product_share{background: url(\"../img/product_ico.png\") 0 -74px no-repeat;}\r\n    .im_product_a a.im_product_go:hover{background: url(\"../img/product_ico.png\") 0 -19px no-repeat;}\r\n    .im_product_favorites:hover{background: url(\"../img/product_ico.png\") 0 -55px no-repeat;}\r\n    .im_product_share:hover{background: url(\"../img/product_ico.png\") 0 -90px no-repeat;}\r\n    .im_product_more{color: #6e737b; font-size: 12px;float:left;margin-top: 12px;}\r\n</style>"
  },
  {
    "path": "ajax/report.html",
    "content": "<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\r\n    <style type=\"text/css\">\r\n        *{padding:0;margin:0;}\r\n        body{font-size:12px;color:#333;line-height: 20px;}\r\n        label,input{float: left;}\r\n        input{margin:3px 5px 0 0;}\r\n        label{margin-right:8px;padding:0 10px 0 2px;}\r\n        label:hover{background: #fafafa;}\r\n        p{line-height: 36px;width: 100%;clear: both;}\r\n        .report{padding:5px 20px;}\r\n    </style>\r\n</head>\r\n<body>\r\n<div class=\"report\">\r\n    <p>举报类型：</p>\r\n    <label><input type=\"checkbox\">色情</label>\r\n    <label><input type=\"checkbox\">广告欺诈</label>\r\n    <label><input type=\"checkbox\">骗子</label>\r\n    <label><input type=\"checkbox\">恶意骚扰</label>\r\n    <label><input type=\"checkbox\">反动</label>\r\n    <label><input type=\"checkbox\">其他</label>\r\n    <p>举报说明：</p>\r\n    <textarea name=\"\" style=\"width:358px;height:80px;border:solid 1px #b7b7b7;outline: none;\"></textarea>\r\n</div>\r\n</body>\r\n</html>"
  },
  {
    "path": "ajax/set.html",
    "content": "<img src=\"img/set.png\" width=\"489\" height=\"288\" />"
  },
  {
    "path": "ajax/share.html",
    "content": "<div class=\"im_sharebox\">\r\n    <a href=\"#\" class=\"weibo\" target=\"_blank\">新浪微博</a>\r\n    <a href=\"#\" class=\"t\" target=\"_blank\">腾讯微博</a>\r\n    <a href=\"#\" class=\"taobao\" target=\"_blank\">我的淘宝</a>\r\n    <a href=\"#\" class=\"qzone\" target=\"_blank\">QQ空间</a>\r\n    <a href=\"#\" class=\"reren\" target=\"_blank\">人人网</a>\r\n    <a href=\"#\" class=\"meili\" target=\"_blank\">美丽说</a>\r\n    <a href=\"#\" class=\"mogu\" target=\"_blank\">蘑菇街</a>\r\n    <a href=\"#\" class=\"kaixin\" target=\"_blank\">开心网</a>\r\n    <a href=\"#\" class=\"sohu\" target=\"_blank\">搜狐微博</a>\r\n    <a href=\"#\" class=\"enet\" target=\"_blank\">网易微博</a>\r\n    <a href=\"#\" class=\"diandian\" target=\"_blank\">点点网</a>\r\n    <a href=\"#\" class=\"btie\" target=\"_blank\">百度贴吧</a>\r\n    <a href=\"#\" class=\"twitter\" target=\"_blank\">Twitter</a>\r\n    <a href=\"#\" class=\"facebook\" target=\"_blank\">Facebook</a>\r\n</div>\r\n<style type=\"text/css\">\r\n    *{padding:0;margin:0;}\r\n    body{font-size: 12px}\r\n    .im_sharebox{width: 332px;height: 162px;}\r\n    .im_sharebox a{display: block;float: left;width:76px;padding-left:24px;margin:4px 5px;line-height: 24px;color:#666;text-decoration: none;background: url(\"../img/share.png\") no-repeat 4px 4px;-moz-border-radius:2px;-khtml-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;}\r\n    .im_sharebox a:hover{border:solid 1px #ddd;background-color: #fcfcfc;margin:3px 4px;text-decoration: none;}\r\n    .im_sharebox a.weibo{background-position: 4px -36px;}\r\n    .im_sharebox a.t{background-position: 4px -156px;}\r\n    .im_sharebox a.taobao{background-position: 4px -476px;}\r\n    .im_sharebox a.qzone{background-position: 4px 4px;}\r\n    .im_sharebox a.reren{background-position: 4px -116px;}\r\n    .im_sharebox a.meili{background-position: 4px -1471px;}\r\n    .im_sharebox a.mogu{background-position: 4px -1511px;}\r\n    .im_sharebox a.kaixin{background-position: 4px -196px;}\r\n    .im_sharebox a.sohu{background-position: 4px -356px;}\r\n    .im_sharebox a.enet{background-position: 4px -636px;}\r\n    .im_sharebox a.diandian{background-position: 4px -1551px;}\r\n    .im_sharebox a.btie{background-position: 4px -76px;}\r\n    .im_sharebox a.twitter{background-position: 4px -1078px;}\r\n    .im_sharebox a.facebook{background-position: 4px -1036px;}\r\n</style>\r\n"
  },
  {
    "path": "ajax/userinfo.php",
    "content": "[\r\n    {\"UserConfig\": [0,0,0,0],\"UserAvatar\": \"../img/avatar_b-sys.png\",\"UserName\": \"zihan\",\"isOnline\": \"online\",\"UID\": \"795238409283faseafaeeDSIKHJ\",\"cid\": \"0982304\",\"cname\": \"淄博林华商贸有限公司\" }\r\n]\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "demo.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <title>即时通讯示例</title>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\r\n</head>\r\n<body>\r\n<a class=\"oWindow\" href=\"#\" uid=\"8759328409230\" style=\"display:block;width:90px;margin:20px\"><img src=\"img/imonline.png\" /></a>\r\n<script type=\"text/javascript\" src=\"js/jQuery-1.7.1.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"js/im.plus.js?skin=im\"></script>\r\n<script type=\"text/javascript\" src=\"js/jQuery.im.js\"></script>\r\n<script type=\"text/javascript\">\r\n    $(function() {\r\n        $(\"a.oWindow\").click(function(){\r\n            var uid=$(this).attr(\"uid\");\r\n             $(document).FnWebIM({\r\n                 autoLogin          :true,      //boolean型，默认是否自动登录，true：自动登录，false：手动登录，默认为true\r\n                 msgRefreshTime    :1000,       //number型，消息刷新时间，单位为ms\r\n                 friendRefreshTime :10000,     //number型，好友刷新时间，单位为ms\r\n                 showSecretary     :true,      //boolean型，默认是否显示小秘书，true：显示，false：不显示，默认为true\r\n                 noticeContent     :\"唐僧师徒历经千辛万苦，终于见到了佛祖……\",        //string型，公告内容 为空时不显示公告\r\n                 sendPicture       :true,      //boolean型，是否允许发送图片，true：允许，false：不允许，默认为true\r\n                 msgMaxSize        :300,        //number型，单条消息最大允许字符\r\n                 msgSound           :false,     //boolean型，是否开启声音提醒，true：开启，false:关闭，默认为true\r\n                 defaultWindow     :uid   //string型，登录后打开新聊天窗口，此处接收的参数为联系人的uid，否则会出错\r\n             });\r\n        });\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "docs/css/docs.css",
    "content": "* {\n    margin: 0;\n    padding: 0;\n}\n\na {\n    outline: none;\n}\n\nbody {\n    line-height: 1;\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\nhtml, body {\n    background: url(../img/faq_foot_bg.png) repeat scroll 0 0 #575C63;\n    color: #F0F0F0;\n    font: 14px/1.5 Helvetica, \"Microsoft YaHei\", Arial, Tahoma;\n    height: 100%;\n    width: 100%;\n    text-align: center;\n    text-shadow: 0 1px 1px #333;\n}\n\npre, code {\n    font: 14px/1.5 Helvetica, \"Microsoft YaHei\", Arial, Tahoma;\n    margin: 10px 0;\n    -moz-border-radius: 3px;\n    -khtml-border-radius: 3px;\n    -webkit-border-radius: 3px;\n    border-radius: 3px;\n}\n\n.fnFaq .faq {\n    width: 100%;\n    background: url(../img/bg_faq_bottom.png) repeat 0 0 transparent;\n    text-shadow: none;\n    text-align: left;\n    padding: 0 0 50px;\n}\n\n.fnFaq .container {\n    width: 1000px;\n    margin: 0 auto;\n}\n\n.fnFaq .faq .logo {\n    position: fixed;\n    top: 40px;\n    display: block;\n    width: 195px;\n    height: 110px;\n    background: url(../img/faq_ico.png) no-repeat transparent -3px 0;\n}\n\n.fnFaq .main {\n    position: relative;\n    width: 790px;\n    margin-left: 212px;\n    background: url(../img/bg_faq.png) repeat 0 0 #fff;\n    box-shadow: 0 1px 1px #999;\n    padding: 45px 0 50px;\n}\n\n.fnFaq .main .faqLine {\n    position: absolute;\n    top: 0;\n    left: 30px;\n    width: 1px;\n    height: 100%;\n    background: #f1f3f3;\n    border-left: 1px solid #edefef;\n    border-right: 1px solid #edefef;\n}\n\n.fnFaq .main .content {\n    text-align: left;\n    width: 770px;\n}\n\n.fnFaq .main .content dl {\n    margin: 0 0 20px;\n}\n\n.fnFaq .main .content dt {\n    background: url(../img/faq_line_point.png) no-repeat 20px 0 transparent;\n    color: #1b1d20;\n    font-size: 16px;\n    font-weight: 700;\n    padding-left: 50px;\n    margin: 0 0 14px;\n}\n\n.fnFaq .main .content dd {\n    color: #565b62;\n    font-size: 14px;\n    line-height: 1.6em;\n    padding-left: 50px;\n}\n\n.fnFaq .main .descripte {\n    color: #6ba5be;\n    padding-left: 50px;\n}\n\n.fnFaq .footer {\n    height: 90px;\n    width: 1000px;\n    line-height: 90px;\n    font-size: 36px;\n    text-align: left;\n    margin: 0 auto;\n}\n\n.fnFaq .footer .img {\n    width: 60px;\n    height: 60px;\n    margin-top: 14px;\n    float: right;\n    background: url(../img/faq_foot_img.png) no-repeat transparent;\n}\n\ntable {\n    max-width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    background-color: #fff;\n\n}\n\n.table {\n    width: 100%;\n    margin-bottom: 18px;\n    border: 1px solid #dddddd;\n}\n\n.table th,\n.table td {\n    padding: 8px;\n    line-height: 18px;\n    text-align: left;\n    vertical-align: top;\n    border: 1px solid #dddddd;\n}\n\n.table th {\n    font-weight: bold;\n}\n\n.table thead th {\n    vertical-align: bottom;\n}\n\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n    border-top: 0;\n}\n\n.table tbody + tbody {\n    border-top: 2px solid #dddddd;\n}\n\n.table-striped tbody tr:nth-child(odd) td,\n.table-striped tbody tr:nth-child(odd) th {\n    background-color: #f9f9f9;\n}\n\n.table tbody tr:hover td,\n.table tbody tr:hover th {\n    background-color: #f5f5f5;\n}\n\n.btn {\n    display: inline-block;\n    *display: inline;\n    /* IE7 inline-block hack */\n\n    *zoom: 1;\n    padding: 4px 10px 4px;\n    margin-bottom: 0;\n    text-decoration: none;\n    font-size: 13px;\n    line-height: 18px;\n    color: #333333;\n    text-align: center;\n    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n    vertical-align: middle;\n    background-color: #f5f5f5;\n    background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n    background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n    background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n    background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n    background-image: linear-gradient(top, #ffffff, #e6e6e6);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#e6e6e6', GradientType = 0);\n    border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n    border: 1px solid #cccccc;\n    border-bottom-color: #b3b3b3;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n    cursor: pointer;\n    *margin-left: .3em;\n}\n\n.btn:hover,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n    background-color: #e6e6e6;\n}\n\n.btn:active,\n.btn.active {\n    background-color: #cccccc \\9;\n}\n\n.btn:first-child {\n    *margin-left: 0;\n}\n\n.btn:hover {\n    color: #333333;\n    text-decoration: none;\n    background-color: #e6e6e6;\n    background-position: 0 -15px;\n    -webkit-transition: background-position 0.1s linear;\n    -moz-transition: background-position 0.1s linear;\n    -ms-transition: background-position 0.1s linear;\n    -o-transition: background-position 0.1s linear;\n    transition: background-position 0.1s linear;\n}\n\n.btn:focus {\n    outline: thin dotted #333;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px;\n}\n\n.btn.active,\n.btn:active {\n    background-image: none;\n    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n    -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n    background-color: #e6e6e6;\n    background-color: #d9d9d9 \\9;\n    outline: 0;\n}\n\n.btn.disabled,\n.btn[disabled] {\n    cursor: default;\n    background-image: none;\n    background-color: #e6e6e6;\n    opacity: 0.65;\n    filter: alpha(opacity = 65);\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n}\n\n.btn-large {\n    padding: 9px 14px;\n    font-size: 15px;\n    line-height: normal;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n}\n\n.btn-large [class^=\"icon-\"] {\n    margin-top: 1px;\n}\n\n.btn-small {\n    padding: 5px 9px;\n    font-size: 11px;\n    line-height: 16px;\n}\n\n.btn-small [class^=\"icon-\"] {\n    margin-top: -1px;\n}\n\n.btn-mini {\n    padding: 2px 6px;\n    font-size: 11px;\n    line-height: 14px;\n}\n\n.btn-primary,\n.btn-primary:hover,\n.btn-warning,\n.btn-warning:hover,\n.btn-danger,\n.btn-danger:hover,\n.btn-success,\n.btn-success:hover,\n.btn-info,\n.btn-info:hover,\n.btn-inverse,\n.btn-inverse:hover {\n    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n    color: #ffffff;\n}\n\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n    color: rgba(255, 255, 255, 0.75);\n}\n\n.btn-primary {\n    background-color: #0074cc;\n    background-image: -moz-linear-gradient(top, #0088cc, #0055cc);\n    background-image: -ms-linear-gradient(top, #0088cc, #0055cc);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));\n    background-image: -webkit-linear-gradient(top, #0088cc, #0055cc);\n    background-image: -o-linear-gradient(top, #0088cc, #0055cc);\n    background-image: linear-gradient(top, #0088cc, #0055cc);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#0088cc', endColorstr = '#0055cc', GradientType = 0);\n    border-color: #0055cc #0055cc #003580;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n    background-color: #0055cc;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n    background-color: #004099 \\9;\n}\n\n.btn-warning {\n    background-color: #faa732;\n    background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n    background-image: -ms-linear-gradient(top, #fbb450, #f89406);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n    background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n    background-image: -o-linear-gradient(top, #fbb450, #f89406);\n    background-image: linear-gradient(top, #fbb450, #f89406);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#fbb450', endColorstr = '#f89406', GradientType = 0);\n    border-color: #f89406 #f89406 #ad6704;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n    background-color: #f89406;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n    background-color: #c67605 \\9;\n}\n\n.btn-danger {\n    background-color: #da4f49;\n    background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n    background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n    background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n    background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n    background-image: linear-gradient(top, #ee5f5b, #bd362f);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ee5f5b', endColorstr = '#bd362f', GradientType = 0);\n    border-color: #bd362f #bd362f #802420;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n    background-color: #bd362f;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n    background-color: #942a25 \\9;\n}\n\n.btn-success {\n    background-color: #5bb75b;\n    background-image: -moz-linear-gradient(top, #62c462, #51a351);\n    background-image: -ms-linear-gradient(top, #62c462, #51a351);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n    background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n    background-image: -o-linear-gradient(top, #62c462, #51a351);\n    background-image: linear-gradient(top, #62c462, #51a351);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#62c462', endColorstr = '#51a351', GradientType = 0);\n    border-color: #51a351 #51a351 #387038;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-success:hover,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n    background-color: #51a351;\n}\n\n.btn-success:active,\n.btn-success.active {\n    background-color: #408140 \\9;\n}\n\n.btn-info {\n    background-color: #49afcd;\n    background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n    background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n    background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n    background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n    background-image: linear-gradient(top, #5bc0de, #2f96b4);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#5bc0de', endColorstr = '#2f96b4', GradientType = 0);\n    border-color: #2f96b4 #2f96b4 #1f6377;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-info:hover,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n    background-color: #2f96b4;\n}\n\n.btn-info:active,\n.btn-info.active {\n    background-color: #24748c \\9;\n}\n\n.btn-inverse {\n    background-color: #414141;\n    background-image: -moz-linear-gradient(top, #555555, #222222);\n    background-image: -ms-linear-gradient(top, #555555, #222222);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));\n    background-image: -webkit-linear-gradient(top, #555555, #222222);\n    background-image: -o-linear-gradient(top, #555555, #222222);\n    background-image: linear-gradient(top, #555555, #222222);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#555555', endColorstr = '#222222', GradientType = 0);\n    border-color: #222222 #222222 #000000;\n    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n    filter: progid:dximagetransform.microsoft.gradient(enabled = false);\n}\n\n.btn-inverse:hover,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n    background-color: #222222;\n}\n\n.btn-inverse:active,\n.btn-inverse.active {\n    background-color: #080808 \\9;\n}\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n    *padding-top: 2px;\n    *padding-bottom: 2px;\n}\n\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n    padding: 0;\n    border: 0;\n}\n\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n    *padding-top: 7px;\n    *padding-bottom: 7px;\n}\n\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n    *padding-top: 3px;\n    *padding-bottom: 3px;\n}\n\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n    *padding-top: 1px;\n    *padding-bottom: 1px;\n}\n\n.alert {\n    padding: 8px 35px 8px 14px;\n    margin-bottom: 18px;\n    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n    background-color: #fcf8e3;\n    border: 1px solid #fbeed5;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n    color: #c09853;\n}\n\n.alert-heading {\n    color: inherit;\n}\n\n.alert .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    line-height: 18px;\n}\n\n.alert-success {\n    background-color: #dff0d8;\n    border-color: #d6e9c6;\n    color: #468847;\n}\n\n.alert-danger,\n.alert-error {\n    background-color: #f2dede;\n    border-color: #eed3d7;\n    color: #b94a48;\n}\n\n.alert-info {\n    background-color: #d9edf7;\n    border-color: #bce8f1;\n    color: #3a87ad;\n}\n\n.alert-block {\n    padding-top: 14px;\n    padding-bottom: 14px;\n}\n\n.alert-block > p,\n.alert-block > ul {\n    margin-bottom: 0;\n}\n\n.alert-block p + p {\n    margin-top: 5px;\n}\n"
  },
  {
    "path": "docs/index.html",
    "content": "\r\n<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\r\n    <title>凡纳网 -- 技术说明文档</title>\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/docs.css\"/>\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"prettify/prettify.css\" media=\"all\">\r\n</head>\r\n<body>\r\n<div class=\"fnFaq\">\r\n    <div class=\"faq\">\r\n        <div class=\"container\">\r\n            <div class=\"logo\"></div>\r\n            <div class=\"main\">\r\n                <div class=\"faqLine\"></div>\r\n                <div class=\"content\">\r\n                    <dl>\r\n                        <dt>1.这是个什么插件？</dt>\r\n                        <dd>\r\n                            <div class=\"alert alert-info\">此插件是凡纳网开发的基于jQuery的一款web即时通讯插件。\r\n                            </div>\r\n                        </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>2.如何调用</dt>\r\n                        <dd>\r\n                            STEP1：在需要调用的页面最后引入以下js\r\n<pre class=\"prettyprint linenums\">\r\n&lt;script type=\"text/javascript\" src=\"js/jQuery-1.7.1.min.js\"&gt;&lt;/script&gt;\r\n&lt;script type=\"text/javascript\" src=\"js/fanna_im.plus.js?skin=fanna_im\"&gt;&lt;/script&gt;\r\n&lt;script type=\"text/javascript\" src=\"js/jQuery.fnIM.js\"&gt;&lt;/script&gt;\r\n</pre>\r\n                            <div class=\"alert\">注意：&lt;script type=\"text/javascript\" src=\"js/fanna_im.plus.js?skin=fanna_im\"&gt;&lt;/script&gt;中所带的skin参数为插件所用到的css文件，如无特殊需要，请勿更改，否则会出错！！！。\r\n                            </div>\r\n                            STEP2:调用插件\r\n<pre class=\"prettyprint linenums\">\r\n$(function() {\r\n         $(document).FnWebIM();   //简单调用\r\n});\r\n</pre>\r\n                        </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>3.参数设置</dt>\r\n                        <dd>\r\n<pre class=\"prettyprint linenums\">\r\n$(function() {\r\n         $(document).FnWebIM({\r\n             autoLogin          :true,\r\n             msgRefreshTime    :1000,\r\n             friendRefreshTime :10000,\r\n             showSecretary     :true,\r\n             noticeContent     :\"公告内容\",\r\n             sendPicture       :true,\r\n             msgMaxSize        :300,\r\n             msgSound           :false,\r\n             defaultWindow     :\"\"\r\n         });\r\n});\r\n</pre>\r\n                        </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>4.【Demo】点击联系人后打开新聊天窗口</dt>\r\n                        <dd>\r\n                            html:\r\n<pre class=\"prettyprint linenums lang-html\">\r\n&lt;a class=\"oWindow\" href=\"#\" uid=\"8759328409230\"&gt;联系我&lt;/a&gt;\r\n</pre>\r\n                            jQuery:\r\n<pre class=\"prettyprint linenums\">\r\n$(function() {\r\n        $(\"a.oWindow\").click(function(){\r\n            var uid=$(this).attr(\"uid\");\r\n             $(document).FnWebIM({\r\n                 defaultWindow     :uid    //注意uid的正确性，当获取不到用户信息时，会出错！！\r\n             });\r\n        });\r\n});\r\n</pre>\r\n                        </dd>\r\n                    </dl>\r\n                    <dt>5.相关参数说明</dt>\r\n                    <dd>\r\n                        <table class=\"table table-striped\">\r\n                            <thead>\r\n                            <tr>\r\n                                <td>参数</td>\r\n                                <td>类型</td>\r\n                                <td>说明</td>\r\n                                <td>默认值</td>\r\n                            </tr>\r\n                            </thead>\r\n                            <tbody>\r\n                            <tr>\r\n                                <td>autoLogin</td>\r\n                                <td>boolean型</td>\r\n                                <td>是否自动登录，true：自动登录，false：手动登录</td>\r\n                                <td>true</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>msgRefreshTime</td>\r\n                                <td>number型</td>\r\n                                <td>消息刷新时间，单位为ms</td>\r\n                                <td>1000</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>friendRefreshTime</td>\r\n                                <td>number型</td>\r\n                                <td>好友列表刷新时间，单位为ms</td>\r\n                                <td>10000</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>showSecretary</td>\r\n                                <td>boolean型</td>\r\n                                <td>默认是否显示小秘书，true：显示，false：不显示</td>\r\n                                <td>true</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>noticeContent</td>\r\n                                <td>string型</td>\r\n                                <td>公告内容，为空时不显示公告</td>\r\n                                <td>&nbsp;</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>sendPicture</td>\r\n                                <td>boolean型</td>\r\n                                <td>是否允许发送图片，true：允许，false：不允许</td>\r\n                                <td>true</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>msgMaxSize</td>\r\n                                <td>number型</td>\r\n                                <td>单条消息最大允许字符数</td>\r\n                                <td>300</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>msgSound</td>\r\n                                <td>boolean型</td>\r\n                                <td>boolean型，是否开启声音提醒，true：开启，false:关闭</td>\r\n                                <td>true</td>\r\n                            </tr>\r\n                            <tr>\r\n                                <td>defaultWindow</td>\r\n                                <td>string型</td>\r\n                                <td>登录后打开新聊天窗口，此处接收的参数为联系人的uid，<br />否则会出错。为空时不打开新窗口</td>\r\n                                <td>&nbsp;</td>\r\n                            </tr>\r\n                            </tbody>\r\n                        </table>\r\n                    </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>5.相关页面说明</dt>\r\n                        <dd>\r\n                            <table class=\"table table-striped\">\r\n                                <thead>\r\n                                <tr>\r\n                                    <td>页面</td>\r\n                                    <td>参数说明</td>\r\n                                </tr>\r\n                                </thead>\r\n                                <tbody>\r\n                                <tr>\r\n                                    <td>userinfo.jsp</td>\r\n                                    <td>· 从session中获取请求的用户标识(UID)；<br/>\r\n                                        · update:更新用户设置\r\n                                    </td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>chats.jsp</td>\r\n                                    <td>· 从session中获取请求的用户标识(UID)；<br />\r\n                                        · del:清空聊天记录；<br />\r\n                                        · add:查看更多记录；<br/>\r\n                                        · time:聊天记录刷新时间\r\n                                    </td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>friends.jsp</td>\r\n                                    <td>· 从session中获取请求的用户标识(UID)；<br />\r\n                                        · time:联系人列表刷新时间\r\n                                    </td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>company.html</td>\r\n                                    <td>· uid:所请求的用户uid；</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>friends.html</td>\r\n                                    <td>· 从session中获取请求的用户标识(UID)；<br/>\r\n                                        · type:好友类型：推荐好友|黑名单\r\n                                    </td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>msgbox.html</td>\r\n                                    <td>· uid:所请求的用户uid；</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>product.html</td>\r\n                                    <td>· pid:所请求的产品ID；</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>set.html</td>\r\n                                    <td>暂空</td>\r\n                                </tr>\r\n                                </tbody>\r\n                                <thead>\r\n                                <tr>\r\n                                    <td>其他页面</td>\r\n                                    <td>说明</td>\r\n                                </tr>\r\n                                </thead>\r\n                                <tbody>\r\n                                <tr>\r\n                                    <td>im_contact.html</td>\r\n                                    <td>联系人列表模板</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>im_window.html</td>\r\n                                    <td>聊天窗口模板</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>reprot.html</td>\r\n                                    <td>举报好友页面</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>share.html</td>\r\n                                    <td>产品分享页面</td>\r\n                                </tr>\r\n                                <tr>\r\n                                    <td>login.html</td>\r\n                                    <td>会话超时页面</td>\r\n                                </tr>\r\n                                </tbody>\r\n                            </table>\r\n                        </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>6.实例演示</dt>\r\n                        <dd>\r\n                            <a href=\"../index.html\" target=\"_blank\" class=\"btn\">普通示例[自动登录]</a>\r\n                            <a href=\"../demo.html\" target=\"_blank\" class=\"btn btn-success oWindow\" uid=\"984234032932\" >点击联系人登录并弹出联系人窗口</a>\r\n                        </dd>\r\n                    </dl>\r\n                    <dl>\r\n                        <dt>7.示例图</dt>\r\n                        <dd>\r\n                            <img src=\"img/webim.png\" width=\"100%\" alt=\"\" />\r\n                            <a href=\"img/webim.png\" target=\"_blank\">查看大图</a>\r\n                        </dd>\r\n                    </dl>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"footer\">\r\n        <div class=\"img\"></div>\r\n        <div class=\"txt\">凡纳网 fnWebIM插件说明文档</div>\r\n    </div>\r\n</div>\r\n<script type=\"text/javascript\" src=\"js/jQuery-1.7.1.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"prettify/prettify.js\"></script>\r\n<script type=\"text/javascript\">\r\n    $(function () {\r\n        window.prettyPrint && prettyPrint()\r\n    });\r\n</script>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "docs/prettify/lang-apollo.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"com\",/^#[^\\n\\r]*/,null,\"#\"],[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,null,'\"']],[[\"kwd\",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\\s/,\nnull],[\"typ\",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\\*?|2?DEC\\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\\s/,null],[\"lit\",/^'(?:-*(?:\\w|\\\\[!-~])(?:[\\w-]*|\\\\[!-~])[!=?]?)?/],[\"pln\",/^-*(?:[!-z]|\\\\[!-~])(?:[\\w-]*|\\\\[!-~])[!=?]?/],[\"pun\",/^[^\\w\\t\\n\\r \"'-);\\\\\\xa0]+/]]),[\"apollo\",\"agc\",\"aea\"]);\n"
  },
  {
    "path": "docs/prettify/lang-clj.js",
    "content": "/*\n Copyright (C) 2011 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar a=null;\nPR.registerLangHandler(PR.createSimpleLexer([[\"opn\",/^[([{]+/,a,\"([{\"],[\"clo\",/^[)\\]}]+/,a,\")]}\"],[\"com\",/^;[^\\n\\r]*/,a,\";\"],[\"pln\",/^[\\t\\n\\r \\xa0]+/,a,\"\\t\\n\\r \\xa0\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,a,'\"']],[[\"kwd\",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\\b/,a],\n[\"typ\",/^:[\\dA-Za-z-]+/]]),[\"clj\"]);\n"
  },
  {
    "path": "docs/prettify/lang-css.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\f\\r ]+/,null,\" \\t\\r\\n\f\"]],[[\"str\",/^\"(?:[^\\n\\f\\r\"\\\\]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\S\\s])*\"/,null],[\"str\",/^'(?:[^\\n\\f\\r'\\\\]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\S\\s])*'/,null],[\"lang-css-str\",/^url\\(([^\"')]*)\\)/i],[\"kwd\",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\\w-]|$)/i,null],[\"lang-css-kw\",/^(-?(?:[_a-z]|\\\\[\\da-f]+ ?)(?:[\\w-]|\\\\\\\\[\\da-f]+ ?)*)\\s*:/i],[\"com\",/^\\/\\*[^*]*\\*+(?:[^*/][^*]*\\*+)*\\//],[\"com\",\n/^(?:<\\!--|--\\>)/],[\"lit\",/^(?:\\d+|\\d*\\.\\d+)(?:%|[a-z]+)?/i],[\"lit\",/^#[\\da-f]{3,6}/i],[\"pln\",/^-?(?:[_a-z]|\\\\[\\da-f]+ ?)(?:[\\w-]|\\\\\\\\[\\da-f]+ ?)*/i],[\"pun\",/^[^\\s\\w\"']+/]]),[\"css\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[\"kwd\",/^-?(?:[_a-z]|\\\\[\\da-f]+ ?)(?:[\\w-]|\\\\\\\\[\\da-f]+ ?)*/i]]),[\"css-kw\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[\"str\",/^[^\"')]+/]]),[\"css-str\"]);\n"
  },
  {
    "path": "docs/prettify/lang-go.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"pln\",/^(?:\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])+(?:'|$)|`[^`]*(?:`|$))/,null,\"\\\"'\"]],[[\"com\",/^(?:\\/\\/[^\\n\\r]*|\\/\\*[\\S\\s]*?\\*\\/)/],[\"pln\",/^(?:[^\"'/`]|\\/(?![*/]))+/]]),[\"go\"]);\n"
  },
  {
    "path": "docs/prettify/lang-hs.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t-\\r ]+/,null,\"\\t\\n\u000b\f\\r \"],[\"str\",/^\"(?:[^\\n\\f\\r\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,null,'\"'],[\"str\",/^'(?:[^\\n\\f\\r'\\\\]|\\\\[^&])'?/,null,\"'\"],[\"lit\",/^(?:0o[0-7]+|0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)/i,null,\"0123456789\"]],[[\"com\",/^(?:--+[^\\n\\f\\r]*|{-(?:[^-]|-+[^}-])*-})/],[\"kwd\",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\\d'A-Za-z]|$)/,\nnull],[\"pln\",/^(?:[A-Z][\\w']*\\.)*[A-Za-z][\\w']*/],[\"pun\",/^[^\\d\\t-\\r \"'A-Za-z]+/]]),[\"hs\"]);\n"
  },
  {
    "path": "docs/prettify/lang-lisp.js",
    "content": "var a=null;\nPR.registerLangHandler(PR.createSimpleLexer([[\"opn\",/^\\(+/,a,\"(\"],[\"clo\",/^\\)+/,a,\")\"],[\"com\",/^;[^\\n\\r]*/,a,\";\"],[\"pln\",/^[\\t\\n\\r \\xa0]+/,a,\"\\t\\n\\r \\xa0\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)/,a,'\"']],[[\"kwd\",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\\b/,a],\n[\"lit\",/^[+-]?(?:[#0]x[\\da-f]+|\\d+\\/\\d+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:[de][+-]?\\d+)?)/i],[\"lit\",/^'(?:-*(?:\\w|\\\\[!-~])(?:[\\w-]*|\\\\[!-~])[!=?]?)?/],[\"pln\",/^-*(?:[_a-z]|\\\\[!-~])(?:[\\w-]*|\\\\[!-~])[!=?]?/i],[\"pun\",/^[^\\w\\t\\n\\r \"'-);\\\\\\xa0]+/]]),[\"cl\",\"el\",\"lisp\",\"scm\"]);\n"
  },
  {
    "path": "docs/prettify/lang-lua.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"str\",/^(?:\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$))/,null,\"\\\"'\"]],[[\"com\",/^--(?:\\[(=*)\\[[\\S\\s]*?(?:]\\1]|$)|[^\\n\\r]*)/],[\"str\",/^\\[(=*)\\[[\\S\\s]*?(?:]\\1]|$)/],[\"kwd\",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,null],[\"lit\",/^[+-]?(?:0x[\\da-f]+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+-]?\\d+)?)/i],\n[\"pln\",/^[_a-z]\\w*/i],[\"pun\",/^[^\\w\\t\\n\\r \\xa0][^\\w\\t\\n\\r \"'+=\\xa0-]*/]]),[\"lua\"]);\n"
  },
  {
    "path": "docs/prettify/lang-ml.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"com\",/^#(?:if[\\t\\n\\r \\xa0]+(?:[$_a-z][\\w']*|``[^\\t\\n\\r`]*(?:``|$))|else|endif|light)/i,null,\"#\"],[\"str\",/^(?:\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])(?:'|$))/,null,\"\\\"'\"]],[[\"com\",/^(?:\\/\\/[^\\n\\r]*|\\(\\*[\\S\\s]*?\\*\\))/],[\"kwd\",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\\b/],\n[\"lit\",/^[+-]?(?:0x[\\da-f]+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+-]?\\d+)?)/i],[\"pln\",/^(?:[_a-z][\\w']*[!#?]?|``[^\\t\\n\\r`]*(?:``|$))/i],[\"pun\",/^[^\\w\\t\\n\\r \"'\\xa0]+/]]),[\"fs\",\"ml\"]);\n"
  },
  {
    "path": "docs/prettify/lang-n.js",
    "content": "var a=null;\nPR.registerLangHandler(PR.createSimpleLexer([[\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*'|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,a,'\"'],[\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,a,\"#\"],[\"pln\",/^\\s+/,a,\" \\r\\n\\t\\xa0\"]],[[\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,a],[\"str\",/^<#[^#>]*(?:#>|$)/,a],[\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,a],[\"com\",/^\\/\\/[^\\n\\r]*/,a],[\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,\na],[\"kwd\",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\\b/,\na],[\"typ\",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\\b/,a],[\"lit\",/^@[$_a-z][\\w$@]*/i,a],[\"typ\",/^@[A-Z]+[a-z][\\w$@]*/,a],[\"pln\",/^'?[$_a-z][\\w$@]*/i,a],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,a,\"0123456789\"],[\"pun\",/^.[^\\s\\w\"-$'./@`]*/,a]]),[\"n\",\"nemerle\"]);\n"
  },
  {
    "path": "docs/prettify/lang-proto.js",
    "content": "PR.registerLangHandler(PR.sourceDecorator({keywords:\"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true\",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\\b/,cStyleComments:!0}),[\"proto\"]);\n"
  },
  {
    "path": "docs/prettify/lang-scala.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"str\",/^\"(?:\"\"(?:\"\"?(?!\")|[^\"\\\\]|\\\\.)*\"{0,3}|(?:[^\\n\\r\"\\\\]|\\\\.)*\"?)/,null,'\"'],[\"lit\",/^`(?:[^\\n\\r\\\\`]|\\\\.)*`?/,null,\"`\"],[\"pun\",/^[!#%&(--:-@[-^{-~]+/,null,\"!#%&()*+,-:;<=>?@[\\\\]^{|}~\"]],[[\"str\",/^'(?:[^\\n\\r'\\\\]|\\\\(?:'|[^\\n\\r']+))'/],[\"lit\",/^'[$A-Z_a-z][\\w$]*(?![\\w$'])/],[\"kwd\",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\\b/],\n[\"lit\",/^(?:true|false|null|this)\\b/],[\"lit\",/^(?:0(?:[0-7]+|x[\\da-f]+)l?|(?:0|[1-9]\\d*)(?:(?:\\.\\d+)?(?:e[+-]?\\d+)?f?|l?)|\\\\.\\d+(?:e[+-]?\\d+)?f?)/i],[\"typ\",/^[$_]*[A-Z][\\d$A-Z_]*[a-z][\\w$]*/],[\"pln\",/^[$A-Z_a-z][\\w$]*/],[\"com\",/^\\/(?:\\/.*|\\*(?:\\/|\\**[^*/])*(?:\\*+\\/?)?)/],[\"pun\",/^(?:\\.+|\\/)/]]),[\"scala\"]);\n"
  },
  {
    "path": "docs/prettify/lang-sql.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"str\",/^(?:\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')/,null,\"\\\"'\"]],[[\"com\",/^(?:--[^\\n\\r]*|\\/\\*[\\S\\s]*?(?:\\*\\/|$))/],[\"kwd\",/^(?:add|all|alter|and|any|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|merge|national|nocheck|nonclustered|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|percent|plan|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rule|save|schema|select|session_user|set|setuser|shutdown|some|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|union|unique|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|writetext)(?=[^\\w-]|$)/i,\nnull],[\"lit\",/^[+-]?(?:0x[\\da-f]+|(?:\\.\\d+|\\d+(?:\\.\\d*)?)(?:e[+-]?\\d+)?)/i],[\"pln\",/^[_a-z][\\w-]*/i],[\"pun\",/^[^\\w\\t\\n\\r \"'\\xa0][^\\w\\t\\n\\r \"'+\\xa0-]*/]]),[\"sql\"]);\n"
  },
  {
    "path": "docs/prettify/lang-tex.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"],[\"com\",/^%[^\\n\\r]*/,null,\"%\"]],[[\"kwd\",/^\\\\[@-Za-z]+/],[\"kwd\",/^\\\\./],[\"typ\",/^[$&]/],[\"lit\",/[+-]?(?:\\.\\d+|\\d+(?:\\.\\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],[\"pun\",/^[()=[\\]{}]+/]]),[\"latex\",\"tex\"]);\n"
  },
  {
    "path": "docs/prettify/lang-vb.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0\\u2028\\u2029]+/,null,\"\\t\\n\\r \\xa0  \"],[\"str\",/^(?:[\"\\u201c\\u201d](?:[^\"\\u201c\\u201d]|[\"\\u201c\\u201d]{2})(?:[\"\\u201c\\u201d]c|$)|[\"\\u201c\\u201d](?:[^\"\\u201c\\u201d]|[\"\\u201c\\u201d]{2})*(?:[\"\\u201c\\u201d]|$))/i,null,'\"“”'],[\"com\",/^['\\u2018\\u2019].*/,null,\"'‘’\"]],[[\"kwd\",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\\b/i,\nnull],[\"com\",/^rem.*/i],[\"lit\",/^(?:true\\b|false\\b|nothing\\b|\\d+(?:e[+-]?\\d+[dfr]?|[dfilrs])?|(?:&h[\\da-f]+|&o[0-7]+)[ils]?|\\d*\\.\\d+(?:e[+-]?\\d+)?[dfr]?|#\\s+(?:\\d+[/-]\\d+[/-]\\d+(?:\\s+\\d+:\\d+(?::\\d+)?(\\s*(?:am|pm))?)?|\\d+:\\d+(?::\\d+)?(\\s*(?:am|pm))?)\\s+#)/i],[\"pln\",/^(?:(?:[a-z]|_\\w)\\w*|\\[(?:[a-z]|_\\w)\\w*])/i],[\"pun\",/^[^\\w\\t\\n\\r \"'[\\]\\xa0\\u2018\\u2019\\u201c\\u201d\\u2028\\u2029]+/],[\"pun\",/^(?:\\[|])/]]),[\"vb\",\"vbs\"]);\n"
  },
  {
    "path": "docs/prettify/lang-vhdl.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\t\\n\\r \\xa0]+/,null,\"\\t\\n\\r \\xa0\"]],[[\"str\",/^(?:[box]?\"(?:[^\"]|\"\")*\"|'.')/i],[\"com\",/^--[^\\n\\r]*/],[\"kwd\",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\\w-]|$)/i,\nnull],[\"typ\",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\\w-]|$)/i,null],[\"typ\",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\\w-]|$)/i,null],[\"lit\",/^\\d+(?:_\\d+)*(?:#[\\w.\\\\]+#(?:[+-]?\\d+(?:_\\d+)*)?|(?:\\.\\d+(?:_\\d+)*)?(?:e[+-]?\\d+(?:_\\d+)*)?)/i],\n[\"pln\",/^(?:[a-z]\\w*|\\\\[^\\\\]*\\\\)/i],[\"pun\",/^[^\\w\\t\\n\\r \"'\\xa0][^\\w\\t\\n\\r \"'\\xa0-]*/]]),[\"vhdl\",\"vhd\"]);\n"
  },
  {
    "path": "docs/prettify/lang-wiki.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"pln\",/^[\\d\\t a-gi-z\\xa0]+/,null,\"\\t \\xa0abcdefgijklmnopqrstuvwxyz0123456789\"],[\"pun\",/^[*=[\\]^~]+/,null,\"=*~^[]\"]],[[\"lang-wiki.meta\",/(?:^^|\\r\\n?|\\n)(#[a-z]+)\\b/],[\"lit\",/^[A-Z][a-z][\\da-z]+[A-Z][a-z][^\\W_]+\\b/],[\"lang-\",/^{{{([\\S\\s]+?)}}}/],[\"lang-\",/^`([^\\n\\r`]+)`/],[\"str\",/^https?:\\/\\/[^\\s#/?]*(?:\\/[^\\s#?]*)?(?:\\?[^\\s#]*)?(?:#\\S*)?/i],[\"pln\",/^(?:\\r\\n|[\\S\\s])[^\\n\\r#*=A-[^`h{~]*/]]),[\"wiki\"]);\nPR.registerLangHandler(PR.createSimpleLexer([[\"kwd\",/^#[a-z]+/i,null,\"#\"]],[]),[\"wiki.meta\"]);\n"
  },
  {
    "path": "docs/prettify/lang-xq.js",
    "content": "PR.registerLangHandler(PR.createSimpleLexer([[\"var pln\",/^\\$[\\w-]+/,null,\"$\"]],[[\"pln\",/^[\\s=][<>][\\s=]/],[\"lit\",/^@[\\w-]+/],[\"tag\",/^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"com\",/^\\(:[\\S\\s]*?:\\)/],[\"pln\",/^[(),/;[\\]{}]$/],[\"str\",/^(?:\"(?:[^\"\\\\{]|\\\\[\\S\\s])*(?:\"|$)|'(?:[^'\\\\{]|\\\\[\\S\\s])*(?:'|$))/,null,\"\\\"'\"],[\"kwd\",/^(?:xquery|where|version|variable|union|typeswitch|treat|to|then|text|stable|sortby|some|self|schema|satisfies|returns|return|ref|processing-instruction|preceding-sibling|preceding|precedes|parent|only|of|node|namespace|module|let|item|intersect|instance|in|import|if|function|for|follows|following-sibling|following|external|except|every|else|element|descending|descendant-or-self|descendant|define|default|declare|comment|child|cast|case|before|attribute|assert|ascending|as|ancestor-or-self|ancestor|after|eq|order|by|or|and|schema-element|document-node|node|at)\\b/],\n[\"typ\",/^(?:xs:yearMonthDuration|xs:unsignedLong|xs:time|xs:string|xs:short|xs:QName|xs:Name|xs:long|xs:integer|xs:int|xs:gYearMonth|xs:gYear|xs:gMonthDay|xs:gDay|xs:float|xs:duration|xs:double|xs:decimal|xs:dayTimeDuration|xs:dateTime|xs:date|xs:byte|xs:boolean|xs:anyURI|xf:yearMonthDuration)\\b/,null],[\"fun pln\",/^(?:xp:dereference|xinc:node-expand|xinc:link-references|xinc:link-expand|xhtml:restructure|xhtml:clean|xhtml:add-lists|xdmp:zip-manifest|xdmp:zip-get|xdmp:zip-create|xdmp:xquery-version|xdmp:word-convert|xdmp:with-namespaces|xdmp:version|xdmp:value|xdmp:user-roles|xdmp:user-last-login|xdmp:user|xdmp:url-encode|xdmp:url-decode|xdmp:uri-is-file|xdmp:uri-format|xdmp:uri-content-type|xdmp:unquote|xdmp:unpath|xdmp:triggers-database|xdmp:trace|xdmp:to-json|xdmp:tidy|xdmp:subbinary|xdmp:strftime|xdmp:spawn-in|xdmp:spawn|xdmp:sleep|xdmp:shutdown|xdmp:set-session-field|xdmp:set-response-encoding|xdmp:set-response-content-type|xdmp:set-response-code|xdmp:set-request-time-limit|xdmp:set|xdmp:servers|xdmp:server-status|xdmp:server-name|xdmp:server|xdmp:security-database|xdmp:security-assert|xdmp:schema-database|xdmp:save|xdmp:role-roles|xdmp:role|xdmp:rethrow|xdmp:restart|xdmp:request-timestamp|xdmp:request-status|xdmp:request-cancel|xdmp:request|xdmp:redirect-response|xdmp:random|xdmp:quote|xdmp:query-trace|xdmp:query-meters|xdmp:product-edition|xdmp:privilege-roles|xdmp:privilege|xdmp:pretty-print|xdmp:powerpoint-convert|xdmp:platform|xdmp:permission|xdmp:pdf-convert|xdmp:path|xdmp:octal-to-integer|xdmp:node-uri|xdmp:node-replace|xdmp:node-kind|xdmp:node-insert-child|xdmp:node-insert-before|xdmp:node-insert-after|xdmp:node-delete|xdmp:node-database|xdmp:mul64|xdmp:modules-root|xdmp:modules-database|xdmp:merging|xdmp:merge-cancel|xdmp:merge|xdmp:md5|xdmp:logout|xdmp:login|xdmp:log-level|xdmp:log|xdmp:lock-release|xdmp:lock-acquire|xdmp:load|xdmp:invoke-in|xdmp:invoke|xdmp:integer-to-octal|xdmp:integer-to-hex|xdmp:http-put|xdmp:http-post|xdmp:http-options|xdmp:http-head|xdmp:http-get|xdmp:http-delete|xdmp:hosts|xdmp:host-status|xdmp:host-name|xdmp:host|xdmp:hex-to-integer|xdmp:hash64|xdmp:hash32|xdmp:has-privilege|xdmp:groups|xdmp:group-serves|xdmp:group-servers|xdmp:group-name|xdmp:group-hosts|xdmp:group|xdmp:get-session-field-names|xdmp:get-session-field|xdmp:get-response-encoding|xdmp:get-response-code|xdmp:get-request-username|xdmp:get-request-user|xdmp:get-request-url|xdmp:get-request-protocol|xdmp:get-request-path|xdmp:get-request-method|xdmp:get-request-header-names|xdmp:get-request-header|xdmp:get-request-field-names|xdmp:get-request-field-filename|xdmp:get-request-field-content-type|xdmp:get-request-field|xdmp:get-request-client-certificate|xdmp:get-request-client-address|xdmp:get-request-body|xdmp:get-current-user|xdmp:get-current-roles|xdmp:get|xdmp:function-name|xdmp:function-module|xdmp:function|xdmp:from-json|xdmp:forests|xdmp:forest-status|xdmp:forest-restore|xdmp:forest-restart|xdmp:forest-name|xdmp:forest-delete|xdmp:forest-databases|xdmp:forest-counts|xdmp:forest-clear|xdmp:forest-backup|xdmp:forest|xdmp:filesystem-file|xdmp:filesystem-directory|xdmp:exists|xdmp:excel-convert|xdmp:eval-in|xdmp:eval|xdmp:estimate|xdmp:email|xdmp:element-content-type|xdmp:elapsed-time|xdmp:document-set-quality|xdmp:document-set-property|xdmp:document-set-properties|xdmp:document-set-permissions|xdmp:document-set-collections|xdmp:document-remove-properties|xdmp:document-remove-permissions|xdmp:document-remove-collections|xdmp:document-properties|xdmp:document-locks|xdmp:document-load|xdmp:document-insert|xdmp:document-get-quality|xdmp:document-get-properties|xdmp:document-get-permissions|xdmp:document-get-collections|xdmp:document-get|xdmp:document-forest|xdmp:document-delete|xdmp:document-add-properties|xdmp:document-add-permissions|xdmp:document-add-collections|xdmp:directory-properties|xdmp:directory-locks|xdmp:directory-delete|xdmp:directory-create|xdmp:directory|xdmp:diacritic-less|xdmp:describe|xdmp:default-permissions|xdmp:default-collections|xdmp:databases|xdmp:database-restore-validate|xdmp:database-restore-status|xdmp:database-restore-cancel|xdmp:database-restore|xdmp:database-name|xdmp:database-forests|xdmp:database-backup-validate|xdmp:database-backup-status|xdmp:database-backup-purge|xdmp:database-backup-cancel|xdmp:database-backup|xdmp:database|xdmp:collection-properties|xdmp:collection-locks|xdmp:collection-delete|xdmp:collation-canonical-uri|xdmp:castable-as|xdmp:can-grant-roles|xdmp:base64-encode|xdmp:base64-decode|xdmp:architecture|xdmp:apply|xdmp:amp-roles|xdmp:amp|xdmp:add64|xdmp:add-response-header|xdmp:access|trgr:trigger-set-recursive|trgr:trigger-set-permissions|trgr:trigger-set-name|trgr:trigger-set-module|trgr:trigger-set-event|trgr:trigger-set-description|trgr:trigger-remove-permissions|trgr:trigger-module|trgr:trigger-get-permissions|trgr:trigger-enable|trgr:trigger-disable|trgr:trigger-database-online-event|trgr:trigger-data-event|trgr:trigger-add-permissions|trgr:remove-trigger|trgr:property-content|trgr:pre-commit|trgr:post-commit|trgr:get-trigger-by-id|trgr:get-trigger|trgr:document-scope|trgr:document-content|trgr:directory-scope|trgr:create-trigger|trgr:collection-scope|trgr:any-property-content|thsr:set-entry|thsr:remove-term|thsr:remove-synonym|thsr:remove-entry|thsr:query-lookup|thsr:lookup|thsr:load|thsr:insert|thsr:expand|thsr:add-synonym|spell:suggest-detailed|spell:suggest|spell:remove-word|spell:make-dictionary|spell:load|spell:levenshtein-distance|spell:is-correct|spell:insert|spell:double-metaphone|spell:add-word|sec:users-collection|sec:user-set-roles|sec:user-set-password|sec:user-set-name|sec:user-set-description|sec:user-set-default-permissions|sec:user-set-default-collections|sec:user-remove-roles|sec:user-privileges|sec:user-get-roles|sec:user-get-description|sec:user-get-default-permissions|sec:user-get-default-collections|sec:user-doc-permissions|sec:user-doc-collections|sec:user-add-roles|sec:unprotect-collection|sec:uid-for-name|sec:set-realm|sec:security-version|sec:security-namespace|sec:security-installed|sec:security-collection|sec:roles-collection|sec:role-set-roles|sec:role-set-name|sec:role-set-description|sec:role-set-default-permissions|sec:role-set-default-collections|sec:role-remove-roles|sec:role-privileges|sec:role-get-roles|sec:role-get-description|sec:role-get-default-permissions|sec:role-get-default-collections|sec:role-doc-permissions|sec:role-doc-collections|sec:role-add-roles|sec:remove-user|sec:remove-role-from-users|sec:remove-role-from-role|sec:remove-role-from-privileges|sec:remove-role-from-amps|sec:remove-role|sec:remove-privilege|sec:remove-amp|sec:protect-collection|sec:privileges-collection|sec:privilege-set-roles|sec:privilege-set-name|sec:privilege-remove-roles|sec:privilege-get-roles|sec:privilege-add-roles|sec:priv-doc-permissions|sec:priv-doc-collections|sec:get-user-names|sec:get-unique-elem-id|sec:get-role-names|sec:get-role-ids|sec:get-privilege|sec:get-distinct-permissions|sec:get-collection|sec:get-amp|sec:create-user-with-role|sec:create-user|sec:create-role|sec:create-privilege|sec:create-amp|sec:collections-collection|sec:collection-set-permissions|sec:collection-remove-permissions|sec:collection-get-permissions|sec:collection-add-permissions|sec:check-admin|sec:amps-collection|sec:amp-set-roles|sec:amp-remove-roles|sec:amp-get-roles|sec:amp-doc-permissions|sec:amp-doc-collections|sec:amp-add-roles|search:unparse|search:suggest|search:snippet|search:search|search:resolve-nodes|search:resolve|search:remove-constraint|search:parse|search:get-default-options|search:estimate|search:check-options|prof:value|prof:reset|prof:report|prof:invoke|prof:eval|prof:enable|prof:disable|prof:allowed|ppt:clean|pki:template-set-request|pki:template-set-name|pki:template-set-key-type|pki:template-set-key-options|pki:template-set-description|pki:template-in-use|pki:template-get-version|pki:template-get-request|pki:template-get-name|pki:template-get-key-type|pki:template-get-key-options|pki:template-get-id|pki:template-get-description|pki:need-certificate|pki:is-temporary|pki:insert-trusted-certificates|pki:insert-template|pki:insert-signed-certificates|pki:insert-certificate-revocation-list|pki:get-trusted-certificate-ids|pki:get-template-ids|pki:get-template-certificate-authority|pki:get-template-by-name|pki:get-template|pki:get-pending-certificate-requests-xml|pki:get-pending-certificate-requests-pem|pki:get-pending-certificate-request|pki:get-certificates-for-template-xml|pki:get-certificates-for-template|pki:get-certificates|pki:get-certificate-xml|pki:get-certificate-pem|pki:get-certificate|pki:generate-temporary-certificate-if-necessary|pki:generate-temporary-certificate|pki:generate-template-certificate-authority|pki:generate-certificate-request|pki:delete-template|pki:delete-certificate|pki:create-template|pdf:make-toc|pdf:insert-toc-headers|pdf:get-toc|pdf:clean|p:status-transition|p:state-transition|p:remove|p:pipelines|p:insert|p:get-by-id|p:get|p:execute|p:create|p:condition|p:collection|p:action|ooxml:runs-merge|ooxml:package-uris|ooxml:package-parts-insert|ooxml:package-parts|msword:clean|mcgm:polygon|mcgm:point|mcgm:geospatial-query-from-elements|mcgm:geospatial-query|mcgm:circle|math:tanh|math:tan|math:sqrt|math:sinh|math:sin|math:pow|math:modf|math:log10|math:log|math:ldexp|math:frexp|math:fmod|math:floor|math:fabs|math:exp|math:cosh|math:cos|math:ceil|math:atan2|math:atan|math:asin|math:acos|map:put|map:map|map:keys|map:get|map:delete|map:count|map:clear|lnk:to|lnk:remove|lnk:insert|lnk:get|lnk:from|lnk:create|kml:polygon|kml:point|kml:interior-polygon|kml:geospatial-query-from-elements|kml:geospatial-query|kml:circle|kml:box|gml:polygon|gml:point|gml:interior-polygon|gml:geospatial-query-from-elements|gml:geospatial-query|gml:circle|gml:box|georss:point|georss:geospatial-query|georss:circle|geo:polygon|geo:point|geo:interior-polygon|geo:geospatial-query-from-elements|geo:geospatial-query|geo:circle|geo:box|fn:zero-or-one|fn:years-from-duration|fn:year-from-dateTime|fn:year-from-date|fn:upper-case|fn:unordered|fn:true|fn:translate|fn:trace|fn:tokenize|fn:timezone-from-time|fn:timezone-from-dateTime|fn:timezone-from-date|fn:sum|fn:subtract-dateTimes-yielding-yearMonthDuration|fn:subtract-dateTimes-yielding-dayTimeDuration|fn:substring-before|fn:substring-after|fn:substring|fn:subsequence|fn:string-to-codepoints|fn:string-pad|fn:string-length|fn:string-join|fn:string|fn:static-base-uri|fn:starts-with|fn:seconds-from-time|fn:seconds-from-duration|fn:seconds-from-dateTime|fn:round-half-to-even|fn:round|fn:root|fn:reverse|fn:resolve-uri|fn:resolve-QName|fn:replace|fn:remove|fn:QName|fn:prefix-from-QName|fn:position|fn:one-or-more|fn:number|fn:not|fn:normalize-unicode|fn:normalize-space|fn:node-name|fn:node-kind|fn:nilled|fn:namespace-uri-from-QName|fn:namespace-uri-for-prefix|fn:namespace-uri|fn:name|fn:months-from-duration|fn:month-from-dateTime|fn:month-from-date|fn:minutes-from-time|fn:minutes-from-duration|fn:minutes-from-dateTime|fn:min|fn:max|fn:matches|fn:lower-case|fn:local-name-from-QName|fn:local-name|fn:last|fn:lang|fn:iri-to-uri|fn:insert-before|fn:index-of|fn:in-scope-prefixes|fn:implicit-timezone|fn:idref|fn:id|fn:hours-from-time|fn:hours-from-duration|fn:hours-from-dateTime|fn:floor|fn:false|fn:expanded-QName|fn:exists|fn:exactly-one|fn:escape-uri|fn:escape-html-uri|fn:error|fn:ends-with|fn:encode-for-uri|fn:empty|fn:document-uri|fn:doc-available|fn:doc|fn:distinct-values|fn:distinct-nodes|fn:default-collation|fn:deep-equal|fn:days-from-duration|fn:day-from-dateTime|fn:day-from-date|fn:data|fn:current-time|fn:current-dateTime|fn:current-date|fn:count|fn:contains|fn:concat|fn:compare|fn:collection|fn:codepoints-to-string|fn:codepoint-equal|fn:ceiling|fn:boolean|fn:base-uri|fn:avg|fn:adjust-time-to-timezone|fn:adjust-dateTime-to-timezone|fn:adjust-date-to-timezone|fn:abs|feed:unsubscribe|feed:subscription|feed:subscribe|feed:request|feed:item|feed:description|excel:clean|entity:enrich|dom:set-pipelines|dom:set-permissions|dom:set-name|dom:set-evaluation-context|dom:set-domain-scope|dom:set-description|dom:remove-pipeline|dom:remove-permissions|dom:remove|dom:get|dom:evaluation-context|dom:domains|dom:domain-scope|dom:create|dom:configuration-set-restart-user|dom:configuration-set-permissions|dom:configuration-set-evaluation-context|dom:configuration-set-default-domain|dom:configuration-get|dom:configuration-create|dom:collection|dom:add-pipeline|dom:add-permissions|dls:retention-rules|dls:retention-rule-remove|dls:retention-rule-insert|dls:retention-rule|dls:purge|dls:node-expand|dls:link-references|dls:link-expand|dls:documents-query|dls:document-versions-query|dls:document-version-uri|dls:document-version-query|dls:document-version-delete|dls:document-version-as-of|dls:document-version|dls:document-update|dls:document-unmanage|dls:document-set-quality|dls:document-set-property|dls:document-set-properties|dls:document-set-permissions|dls:document-set-collections|dls:document-retention-rules|dls:document-remove-properties|dls:document-remove-permissions|dls:document-remove-collections|dls:document-purge|dls:document-manage|dls:document-is-managed|dls:document-insert-and-manage|dls:document-include-query|dls:document-history|dls:document-get-permissions|dls:document-extract-part|dls:document-delete|dls:document-checkout-status|dls:document-checkout|dls:document-checkin|dls:document-add-properties|dls:document-add-permissions|dls:document-add-collections|dls:break-checkout|dls:author-query|dls:as-of-query|dbk:convert|dbg:wait|dbg:value|dbg:stopped|dbg:stop|dbg:step|dbg:status|dbg:stack|dbg:out|dbg:next|dbg:line|dbg:invoke|dbg:function|dbg:finish|dbg:expr|dbg:eval|dbg:disconnect|dbg:detach|dbg:continue|dbg:connect|dbg:clear|dbg:breakpoints|dbg:break|dbg:attached|dbg:attach|cvt:save-converted-documents|cvt:part-uri|cvt:destination-uri|cvt:basepath|cvt:basename|cts:words|cts:word-query-weight|cts:word-query-text|cts:word-query-options|cts:word-query|cts:word-match|cts:walk|cts:uris|cts:uri-match|cts:train|cts:tokenize|cts:thresholds|cts:stem|cts:similar-query-weight|cts:similar-query-nodes|cts:similar-query|cts:shortest-distance|cts:search|cts:score|cts:reverse-query-weight|cts:reverse-query-nodes|cts:reverse-query|cts:remainder|cts:registered-query-weight|cts:registered-query-options|cts:registered-query-ids|cts:registered-query|cts:register|cts:query|cts:quality|cts:properties-query-query|cts:properties-query|cts:polygon-vertices|cts:polygon|cts:point-longitude|cts:point-latitude|cts:point|cts:or-query-queries|cts:or-query|cts:not-query-weight|cts:not-query-query|cts:not-query|cts:near-query-weight|cts:near-query-queries|cts:near-query-options|cts:near-query-distance|cts:near-query|cts:highlight|cts:geospatial-co-occurrences|cts:frequency|cts:fitness|cts:field-words|cts:field-word-query-weight|cts:field-word-query-text|cts:field-word-query-options|cts:field-word-query-field-name|cts:field-word-query|cts:field-word-match|cts:entity-highlight|cts:element-words|cts:element-word-query-weight|cts:element-word-query-text|cts:element-word-query-options|cts:element-word-query-element-name|cts:element-word-query|cts:element-word-match|cts:element-values|cts:element-value-ranges|cts:element-value-query-weight|cts:element-value-query-text|cts:element-value-query-options|cts:element-value-query-element-name|cts:element-value-query|cts:element-value-match|cts:element-value-geospatial-co-occurrences|cts:element-value-co-occurrences|cts:element-range-query-weight|cts:element-range-query-value|cts:element-range-query-options|cts:element-range-query-operator|cts:element-range-query-element-name|cts:element-range-query|cts:element-query-query|cts:element-query-element-name|cts:element-query|cts:element-pair-geospatial-values|cts:element-pair-geospatial-value-match|cts:element-pair-geospatial-query-weight|cts:element-pair-geospatial-query-region|cts:element-pair-geospatial-query-options|cts:element-pair-geospatial-query-longitude-name|cts:element-pair-geospatial-query-latitude-name|cts:element-pair-geospatial-query-element-name|cts:element-pair-geospatial-query|cts:element-pair-geospatial-boxes|cts:element-geospatial-values|cts:element-geospatial-value-match|cts:element-geospatial-query-weight|cts:element-geospatial-query-region|cts:element-geospatial-query-options|cts:element-geospatial-query-element-name|cts:element-geospatial-query|cts:element-geospatial-boxes|cts:element-child-geospatial-values|cts:element-child-geospatial-value-match|cts:element-child-geospatial-query-weight|cts:element-child-geospatial-query-region|cts:element-child-geospatial-query-options|cts:element-child-geospatial-query-element-name|cts:element-child-geospatial-query-child-name|cts:element-child-geospatial-query|cts:element-child-geospatial-boxes|cts:element-attribute-words|cts:element-attribute-word-query-weight|cts:element-attribute-word-query-text|cts:element-attribute-word-query-options|cts:element-attribute-word-query-element-name|cts:element-attribute-word-query-attribute-name|cts:element-attribute-word-query|cts:element-attribute-word-match|cts:element-attribute-values|cts:element-attribute-value-ranges|cts:element-attribute-value-query-weight|cts:element-attribute-value-query-text|cts:element-attribute-value-query-options|cts:element-attribute-value-query-element-name|cts:element-attribute-value-query-attribute-name|cts:element-attribute-value-query|cts:element-attribute-value-match|cts:element-attribute-value-geospatial-co-occurrences|cts:element-attribute-value-co-occurrences|cts:element-attribute-range-query-weight|cts:element-attribute-range-query-value|cts:element-attribute-range-query-options|cts:element-attribute-range-query-operator|cts:element-attribute-range-query-element-name|cts:element-attribute-range-query-attribute-name|cts:element-attribute-range-query|cts:element-attribute-pair-geospatial-values|cts:element-attribute-pair-geospatial-value-match|cts:element-attribute-pair-geospatial-query-weight|cts:element-attribute-pair-geospatial-query-region|cts:element-attribute-pair-geospatial-query-options|cts:element-attribute-pair-geospatial-query-longitude-name|cts:element-attribute-pair-geospatial-query-latitude-name|cts:element-attribute-pair-geospatial-query-element-name|cts:element-attribute-pair-geospatial-query|cts:element-attribute-pair-geospatial-boxes|cts:document-query-uris|cts:document-query|cts:distance|cts:directory-query-uris|cts:directory-query-depth|cts:directory-query|cts:destination|cts:deregister|cts:contains|cts:confidence|cts:collections|cts:collection-query-uris|cts:collection-query|cts:collection-match|cts:classify|cts:circle-radius|cts:circle-center|cts:circle|cts:box-west|cts:box-south|cts:box-north|cts:box-east|cts:box|cts:bearing|cts:arc-intersection|cts:and-query-queries|cts:and-query-options|cts:and-query|cts:and-not-query-positive-query|cts:and-not-query-negative-query|cts:and-not-query|css:get|css:convert|cpf:success|cpf:failure|cpf:document-set-state|cpf:document-set-processing-status|cpf:document-set-last-updated|cpf:document-set-error|cpf:document-get-state|cpf:document-get-processing-status|cpf:document-get-last-updated|cpf:document-get-error|cpf:check-transition|alert:spawn-matching-actions|alert:rule-user-id-query|alert:rule-set-user-id|alert:rule-set-query|alert:rule-set-options|alert:rule-set-name|alert:rule-set-description|alert:rule-set-action|alert:rule-remove|alert:rule-name-query|alert:rule-insert|alert:rule-id-query|alert:rule-get-user-id|alert:rule-get-query|alert:rule-get-options|alert:rule-get-name|alert:rule-get-id|alert:rule-get-description|alert:rule-get-action|alert:rule-action-query|alert:remove-triggers|alert:make-rule|alert:make-log-action|alert:make-config|alert:make-action|alert:invoke-matching-actions|alert:get-my-rules|alert:get-all-rules|alert:get-actions|alert:find-matching-rules|alert:create-triggers|alert:config-set-uri|alert:config-set-trigger-ids|alert:config-set-options|alert:config-set-name|alert:config-set-description|alert:config-set-cpf-domain-names|alert:config-set-cpf-domain-ids|alert:config-insert|alert:config-get-uri|alert:config-get-trigger-ids|alert:config-get-options|alert:config-get-name|alert:config-get-id|alert:config-get-description|alert:config-get-cpf-domain-names|alert:config-get-cpf-domain-ids|alert:config-get|alert:config-delete|alert:action-set-options|alert:action-set-name|alert:action-set-module-root|alert:action-set-module-db|alert:action-set-module|alert:action-set-description|alert:action-remove|alert:action-insert|alert:action-get-options|alert:action-get-name|alert:action-get-module-root|alert:action-get-module-db|alert:action-get-module|alert:action-get-description|zero-or-one|years-from-duration|year-from-dateTime|year-from-date|upper-case|unordered|true|translate|trace|tokenize|timezone-from-time|timezone-from-dateTime|timezone-from-date|sum|subtract-dateTimes-yielding-yearMonthDuration|subtract-dateTimes-yielding-dayTimeDuration|substring-before|substring-after|substring|subsequence|string-to-codepoints|string-pad|string-length|string-join|string|static-base-uri|starts-with|seconds-from-time|seconds-from-duration|seconds-from-dateTime|round-half-to-even|round|root|reverse|resolve-uri|resolve-QName|replace|remove|QName|prefix-from-QName|position|one-or-more|number|not|normalize-unicode|normalize-space|node-name|node-kind|nilled|namespace-uri-from-QName|namespace-uri-for-prefix|namespace-uri|name|months-from-duration|month-from-dateTime|month-from-date|minutes-from-time|minutes-from-duration|minutes-from-dateTime|min|max|matches|lower-case|local-name-from-QName|local-name|last|lang|iri-to-uri|insert-before|index-of|in-scope-prefixes|implicit-timezone|idref|id|hours-from-time|hours-from-duration|hours-from-dateTime|floor|false|expanded-QName|exists|exactly-one|escape-uri|escape-html-uri|error|ends-with|encode-for-uri|empty|document-uri|doc-available|doc|distinct-values|distinct-nodes|default-collation|deep-equal|days-from-duration|day-from-dateTime|day-from-date|data|current-time|current-dateTime|current-date|count|contains|concat|compare|collection|codepoints-to-string|codepoint-equal|ceiling|boolean|base-uri|avg|adjust-time-to-timezone|adjust-dateTime-to-timezone|adjust-date-to-timezone|abs)\\b/],\n[\"pln\",/^[\\w:-]+/],[\"pln\",/^[\\t\\n\\r \\xa0]+/]]),[\"xq\",\"xquery\"]);\n"
  },
  {
    "path": "docs/prettify/lang-yaml.js",
    "content": "var a=null;\nPR.registerLangHandler(PR.createSimpleLexer([[\"pun\",/^[:>?|]+/,a,\":|>?\"],[\"dec\",/^%(?:YAML|TAG)[^\\n\\r#]+/,a,\"%\"],[\"typ\",/^&\\S+/,a,\"&\"],[\"typ\",/^!\\S*/,a,\"!\"],[\"str\",/^\"(?:[^\"\\\\]|\\\\.)*(?:\"|$)/,a,'\"'],[\"str\",/^'(?:[^']|'')*(?:'|$)/,a,\"'\"],[\"com\",/^#[^\\n\\r]*/,a,\"#\"],[\"pln\",/^\\s+/,a,\" \\t\\r\\n\"]],[[\"dec\",/^(?:---|\\.\\.\\.)(?:[\\n\\r]|$)/],[\"pun\",/^-/],[\"kwd\",/^\\w+:[\\n\\r ]/],[\"pln\",/^\\w+/]]),[\"yaml\",\"yml\"]);\n"
  },
  {
    "path": "docs/prettify/prettify.css",
    "content": ".com { color: #93a1a1; }\n.lit { color: #195f91; }\n.pun, .opn, .clo { color: #93a1a1; }\n.fun { color: #dc322f; }\n.str, .atv { color: #D14; }\n.kwd, .linenums .tag { color: #1e347b; }\n.typ, .atn, .dec, .var { color: teal; }\n.pln { color: #48484c; }\n\n.prettyprint {\n    padding: 8px;\n    background-color: #f7f7f9;\n    border: 1px solid #e1e1e8;\n}\n.prettyprint.linenums {\n    -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n    -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n    box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n}\n\n/* Specify class=linenums on a pre to get line numbering */\nol.linenums {\n    margin: 0 0 0 33px; /* IE indents via margin-left */\n}\nol.linenums li {\n    padding-left: 12px;\n    color: #bebec5;\n    line-height: 18px;\n    text-shadow: 0 1px 0 #fff;\n}"
  },
  {
    "path": "docs/prettify/prettify.js",
    "content": "// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * some functions for browser-side pretty printing of code contained in html.\n *\n * <p>\n * For a fairly comprehensive set of languages see the\n * <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs\">README</a>\n * file that came with this source.  At a minimum, the lexer should work on a\n * number of languages including C and friends, Java, Python, Bash, SQL, HTML,\n * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk\n * and a subset of Perl, but, because of commenting conventions, doesn't work on\n * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.\n * <p>\n * Usage: <ol>\n * <li> include this source file in an html page via\n *   {@code <script type=\"text/javascript\" src=\"/path/to/prettify.js\"></script>}\n * <li> define style rules.  See the example page for examples.\n * <li> mark the {@code <pre>} and {@code <code>} tags in your source with\n *    {@code class=prettyprint.}\n *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty\n *    printer needs to do more substantial DOM manipulations to support that, so\n *    some css styles may not be preserved.\n * </ol>\n * That's it.  I wanted to keep the API as simple as possible, so there's no\n * need to specify which language the code is in, but if you wish, you can add\n * another class to the {@code <pre>} or {@code <code>} element to specify the\n * language, as in {@code <pre class=\"prettyprint lang-java\">}.  Any class that\n * starts with \"lang-\" followed by a file extension, specifies the file type.\n * See the \"lang-*.js\" files in this directory for code that implements\n * per-language file handlers.\n * <p>\n * Change log:<br>\n * cbeust, 2006/08/22\n * <blockquote>\n *   Java annotations (start with \"@\") are now captured as literals (\"lit\")\n * </blockquote>\n * @requires console\n */\n\n// JSLint declarations\n/*global console, document, navigator, setTimeout, window */\n\n/**\n * Split {@code prettyPrint} into multiple timeouts so as not to interfere with\n * UI events.\n * If set to {@code false}, {@code prettyPrint()} is synchronous.\n */\nwindow['PR_SHOULD_USE_CONTINUATION'] = true;\n\n(function () {\n    // Keyword lists for various languages.\n    // We use things that coerce to strings to make them compact when minified\n    // and to defeat aggressive optimizers that fold large string constants.\n    var FLOW_CONTROL_KEYWORDS = [\"break,continue,do,else,for,if,return,while\"];\n    var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\" +\n        \"double,enum,extern,float,goto,int,long,register,short,signed,sizeof,\" +\n        \"static,struct,switch,typedef,union,unsigned,void,volatile\"];\n    var COMMON_KEYWORDS = [C_KEYWORDS,\"catch,class,delete,false,import,\" +\n        \"new,operator,private,protected,public,this,throw,true,try,typeof\"];\n    var CPP_KEYWORDS = [COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\" +\n        \"concept,concept_map,const_cast,constexpr,decltype,\" +\n        \"dynamic_cast,explicit,export,friend,inline,late_check,\" +\n        \"mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,\" +\n        \"template,typeid,typename,using,virtual,where\"];\n    var JAVA_KEYWORDS = [COMMON_KEYWORDS,\n        \"abstract,boolean,byte,extends,final,finally,implements,import,\" +\n            \"instanceof,null,native,package,strictfp,super,synchronized,throws,\" +\n            \"transient\"];\n    var CSHARP_KEYWORDS = [JAVA_KEYWORDS,\n        \"as,base,by,checked,decimal,delegate,descending,dynamic,event,\" +\n            \"fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,\" +\n            \"object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,\" +\n            \"stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"];\n    var COFFEE_KEYWORDS = \"all,and,by,catch,class,else,extends,false,finally,\" +\n        \"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\" +\n        \"true,try,unless,until,when,while,yes\";\n    var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,\n        \"debugger,eval,export,function,get,null,set,undefined,var,with,\" +\n            \"Infinity,NaN\"];\n    var PERL_KEYWORDS = \"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\" +\n        \"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\" +\n        \"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";\n    var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"and,as,assert,class,def,del,\" +\n        \"elif,except,exec,finally,from,global,import,in,is,lambda,\" +\n        \"nonlocal,not,or,pass,print,raise,try,with,yield,\" +\n        \"False,True,None\"];\n    var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"alias,and,begin,case,class,\" +\n        \"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\" +\n        \"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\" +\n        \"BEGIN,END\"];\n    var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"case,done,elif,esac,eval,fi,\" +\n        \"function,in,local,set,then,until\"];\n    var ALL_KEYWORDS = [\n        CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +\n            PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];\n    var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/;\n\n    // token style names.  correspond to css classes\n    /**\n     * token style for a string literal\n     * @const\n     */\n    var PR_STRING = 'str';\n    /**\n     * token style for a keyword\n     * @const\n     */\n    var PR_KEYWORD = 'kwd';\n    /**\n     * token style for a comment\n     * @const\n     */\n    var PR_COMMENT = 'com';\n    /**\n     * token style for a type\n     * @const\n     */\n    var PR_TYPE = 'typ';\n    /**\n     * token style for a literal value.  e.g. 1, null, true.\n     * @const\n     */\n    var PR_LITERAL = 'lit';\n    /**\n     * token style for a punctuation string.\n     * @const\n     */\n    var PR_PUNCTUATION = 'pun';\n    /**\n     * token style for a punctuation string.\n     * @const\n     */\n    var PR_PLAIN = 'pln';\n\n    /**\n     * token style for an sgml tag.\n     * @const\n     */\n    var PR_TAG = 'tag';\n    /**\n     * token style for a markup declaration such as a DOCTYPE.\n     * @const\n     */\n    var PR_DECLARATION = 'dec';\n    /**\n     * token style for embedded source.\n     * @const\n     */\n    var PR_SOURCE = 'src';\n    /**\n     * token style for an sgml attribute name.\n     * @const\n     */\n    var PR_ATTRIB_NAME = 'atn';\n    /**\n     * token style for an sgml attribute value.\n     * @const\n     */\n    var PR_ATTRIB_VALUE = 'atv';\n\n    /**\n     * A class that indicates a section of markup that is not code, e.g. to allow\n     * embedding of line numbers within code listings.\n     * @const\n     */\n    var PR_NOCODE = 'nocode';\n\n\n\n    /**\n     * A set of tokens that can precede a regular expression literal in\n     * javascript\n     * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html\n     * has the full list, but I've removed ones that might be problematic when\n     * seen in languages that don't support regular expression literals.\n     *\n     * <p>Specifically, I've removed any keywords that can't precede a regexp\n     * literal in a syntactically legal javascript program, and I've removed the\n     * \"in\" keyword since it's not a keyword in many languages, and might be used\n     * as a count of inches.\n     *\n     * <p>The link a above does not accurately describe EcmaScript rules since\n     * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works\n     * very well in practice.\n     *\n     * @private\n     * @const\n     */\n    var REGEXP_PRECEDER_PATTERN = '(?:^^\\\\.?|[+-]|\\\\!|\\\\!=|\\\\!==|\\\\#|\\\\%|\\\\%=|&|&&|&&=|&=|\\\\(|\\\\*|\\\\*=|\\\\+=|\\\\,|\\\\-=|\\\\->|\\\\/|\\\\/=|:|::|\\\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\@|\\\\[|\\\\^|\\\\^=|\\\\^\\\\^|\\\\^\\\\^=|\\\\{|\\\\||\\\\|=|\\\\|\\\\||\\\\|\\\\|=|\\\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*';\n\n// CAVEAT: this does not properly handle the case where a regular\n// expression immediately follows another since a regular expression may\n// have flags for case-sensitivity and the like.  Having regexp tokens\n// adjacent is not valid in any language I'm aware of, so I'm punting.\n// TODO: maybe style special characters inside a regexp as punctuation.\n\n\n    /**\n     * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally\n     * matches the union of the sets of strings matched by the input RegExp.\n     * Since it matches globally, if the input strings have a start-of-input\n     * anchor (/^.../), it is ignored for the purposes of unioning.\n     * @param {Array.<RegExp>} regexs non multiline, non-global regexs.\n     * @return {RegExp} a global regex.\n     */\n    function combinePrefixPatterns(regexs) {\n        var capturedGroupIndex = 0;\n\n        var needToFoldCase = false;\n        var ignoreCase = false;\n        for (var i = 0, n = regexs.length; i < n; ++i) {\n            var regex = regexs[i];\n            if (regex.ignoreCase) {\n                ignoreCase = true;\n            } else if (/[a-z]/i.test(regex.source.replace(\n                /\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi, ''))) {\n                needToFoldCase = true;\n                ignoreCase = false;\n                break;\n            }\n        }\n\n        var escapeCharToCodeUnit = {\n            'b': 8,\n            't': 9,\n            'n': 0xa,\n            'v': 0xb,\n            'f': 0xc,\n            'r': 0xd\n        };\n\n        function decodeEscape(charsetPart) {\n            var cc0 = charsetPart.charCodeAt(0);\n            if (cc0 !== 92 /* \\\\ */) {\n                return cc0;\n            }\n            var c1 = charsetPart.charAt(1);\n            cc0 = escapeCharToCodeUnit[c1];\n            if (cc0) {\n                return cc0;\n            } else if ('0' <= c1 && c1 <= '7') {\n                return parseInt(charsetPart.substring(1), 8);\n            } else if (c1 === 'u' || c1 === 'x') {\n                return parseInt(charsetPart.substring(2), 16);\n            } else {\n                return charsetPart.charCodeAt(1);\n            }\n        }\n\n        function encodeEscape(charCode) {\n            if (charCode < 0x20) {\n                return (charCode < 0x10 ? '\\\\x0' : '\\\\x') + charCode.toString(16);\n            }\n            var ch = String.fromCharCode(charCode);\n            if (ch === '\\\\' || ch === '-' || ch === '[' || ch === ']') {\n                ch = '\\\\' + ch;\n            }\n            return ch;\n        }\n\n        function caseFoldCharset(charSet) {\n            var charsetParts = charSet.substring(1, charSet.length - 1).match(\n                new RegExp(\n                    '\\\\\\\\u[0-9A-Fa-f]{4}'\n                        + '|\\\\\\\\x[0-9A-Fa-f]{2}'\n                        + '|\\\\\\\\[0-3][0-7]{0,2}'\n                        + '|\\\\\\\\[0-7]{1,2}'\n                        + '|\\\\\\\\[\\\\s\\\\S]'\n                        + '|-'\n                        + '|[^-\\\\\\\\]',\n                    'g'));\n            var groups = [];\n            var ranges = [];\n            var inverse = charsetParts[0] === '^';\n            for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {\n                var p = charsetParts[i];\n                if (/\\\\[bdsw]/i.test(p)) {  // Don't muck with named groups.\n                    groups.push(p);\n                } else {\n                    var start = decodeEscape(p);\n                    var end;\n                    if (i + 2 < n && '-' === charsetParts[i + 1]) {\n                        end = decodeEscape(charsetParts[i + 2]);\n                        i += 2;\n                    } else {\n                        end = start;\n                    }\n                    ranges.push([start, end]);\n                    // If the range might intersect letters, then expand it.\n                    // This case handling is too simplistic.\n                    // It does not deal with non-latin case folding.\n                    // It works for latin source code identifiers though.\n                    if (!(end < 65 || start > 122)) {\n                        if (!(end < 65 || start > 90)) {\n                            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);\n                        }\n                        if (!(end < 97 || start > 122)) {\n                            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);\n                        }\n                    }\n                }\n            }\n\n            // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]\n            // -> [[1, 12], [14, 14], [16, 17]]\n            ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });\n            var consolidatedRanges = [];\n            var lastRange = [NaN, NaN];\n            for (var i = 0; i < ranges.length; ++i) {\n                var range = ranges[i];\n                if (range[0] <= lastRange[1] + 1) {\n                    lastRange[1] = Math.max(lastRange[1], range[1]);\n                } else {\n                    consolidatedRanges.push(lastRange = range);\n                }\n            }\n\n            var out = ['['];\n            if (inverse) { out.push('^'); }\n            out.push.apply(out, groups);\n            for (var i = 0; i < consolidatedRanges.length; ++i) {\n                var range = consolidatedRanges[i];\n                out.push(encodeEscape(range[0]));\n                if (range[1] > range[0]) {\n                    if (range[1] + 1 > range[0]) { out.push('-'); }\n                    out.push(encodeEscape(range[1]));\n                }\n            }\n            out.push(']');\n            return out.join('');\n        }\n\n        function allowAnywhereFoldCaseAndRenumberGroups(regex) {\n            // Split into character sets, escape sequences, punctuation strings\n            // like ('(', '(?:', ')', '^'), and runs of characters that do not\n            // include any of the above.\n            var parts = regex.source.match(\n                new RegExp(\n                    '(?:'\n                        + '\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]'  // a character set\n                        + '|\\\\\\\\u[A-Fa-f0-9]{4}'  // a unicode escape\n                        + '|\\\\\\\\x[A-Fa-f0-9]{2}'  // a hex escape\n                        + '|\\\\\\\\[0-9]+'  // a back-reference or octal escape\n                        + '|\\\\\\\\[^ux0-9]'  // other escape sequence\n                        + '|\\\\(\\\\?[:!=]'  // start of a non-capturing group\n                        + '|[\\\\(\\\\)\\\\^]'  // start/emd of a group, or line start\n                        + '|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+'  // run of other characters\n                        + ')',\n                    'g'));\n            var n = parts.length;\n\n            // Maps captured group numbers to the number they will occupy in\n            // the output or to -1 if that has not been determined, or to\n            // undefined if they need not be capturing in the output.\n            var capturedGroups = [];\n\n            // Walk over and identify back references to build the capturedGroups\n            // mapping.\n            for (var i = 0, groupIndex = 0; i < n; ++i) {\n                var p = parts[i];\n                if (p === '(') {\n                    // groups are 1-indexed, so max group index is count of '('\n                    ++groupIndex;\n                } else if ('\\\\' === p.charAt(0)) {\n                    var decimalValue = +p.substring(1);\n                    if (decimalValue && decimalValue <= groupIndex) {\n                        capturedGroups[decimalValue] = -1;\n                    }\n                }\n            }\n\n            // Renumber groups and reduce capturing groups to non-capturing groups\n            // where possible.\n            for (var i = 1; i < capturedGroups.length; ++i) {\n                if (-1 === capturedGroups[i]) {\n                    capturedGroups[i] = ++capturedGroupIndex;\n                }\n            }\n            for (var i = 0, groupIndex = 0; i < n; ++i) {\n                var p = parts[i];\n                if (p === '(') {\n                    ++groupIndex;\n                    if (capturedGroups[groupIndex] === undefined) {\n                        parts[i] = '(?:';\n                    }\n                } else if ('\\\\' === p.charAt(0)) {\n                    var decimalValue = +p.substring(1);\n                    if (decimalValue && decimalValue <= groupIndex) {\n                        parts[i] = '\\\\' + capturedGroups[groupIndex];\n                    }\n                }\n            }\n\n            // Remove any prefix anchors so that the output will match anywhere.\n            // ^^ really does mean an anchored match though.\n            for (var i = 0, groupIndex = 0; i < n; ++i) {\n                if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }\n            }\n\n            // Expand letters to groups to handle mixing of case-sensitive and\n            // case-insensitive patterns if necessary.\n            if (regex.ignoreCase && needToFoldCase) {\n                for (var i = 0; i < n; ++i) {\n                    var p = parts[i];\n                    var ch0 = p.charAt(0);\n                    if (p.length >= 2 && ch0 === '[') {\n                        parts[i] = caseFoldCharset(p);\n                    } else if (ch0 !== '\\\\') {\n                        // TODO: handle letters in numeric escapes.\n                        parts[i] = p.replace(\n                            /[a-zA-Z]/g,\n                            function (ch) {\n                                var cc = ch.charCodeAt(0);\n                                return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';\n                            });\n                    }\n                }\n            }\n\n            return parts.join('');\n        }\n\n        var rewritten = [];\n        for (var i = 0, n = regexs.length; i < n; ++i) {\n            var regex = regexs[i];\n            if (regex.global || regex.multiline) { throw new Error('' + regex); }\n            rewritten.push(\n                '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');\n        }\n\n        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');\n    }\n\n\n    /**\n     * Split markup into a string of source code and an array mapping ranges in\n     * that string to the text nodes in which they appear.\n     *\n     * <p>\n     * The HTML DOM structure:</p>\n     * <pre>\n     * (Element   \"p\"\n     *   (Element \"b\"\n     *     (Text  \"print \"))       ; #1\n     *   (Text    \"'Hello '\")      ; #2\n     *   (Element \"br\")            ; #3\n     *   (Text    \"  + 'World';\")) ; #4\n     * </pre>\n     * <p>\n     * corresponds to the HTML\n     * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>\n     *\n     * <p>\n     * It will produce the output:</p>\n     * <pre>\n     * {\n     *   sourceCode: \"print 'Hello '\\n  + 'World';\",\n     *   //                 1         2\n     *   //       012345678901234 5678901234567\n     *   spans: [0, #1, 6, #2, 14, #3, 15, #4]\n     * }\n     * </pre>\n     * <p>\n     * where #1 is a reference to the {@code \"print \"} text node above, and so\n     * on for the other text nodes.\n     * </p>\n     *\n     * <p>\n     * The {@code} spans array is an array of pairs.  Even elements are the start\n     * indices of substrings, and odd elements are the text nodes (or BR elements)\n     * that contain the text for those substrings.\n     * Substrings continue until the next index or the end of the source.\n     * </p>\n     *\n     * @param {Node} node an HTML DOM subtree containing source-code.\n     * @return {Object} source code and the text nodes in which they occur.\n     */\n    function extractSourceSpans(node) {\n        var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n\n        var chunks = [];\n        var length = 0;\n        var spans = [];\n        var k = 0;\n\n        var whitespace;\n        if (node.currentStyle) {\n            whitespace = node.currentStyle.whiteSpace;\n        } else if (window.getComputedStyle) {\n            whitespace = document.defaultView.getComputedStyle(node, null)\n                .getPropertyValue('white-space');\n        }\n        var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);\n\n        function walk(node) {\n            switch (node.nodeType) {\n                case 1:  // Element\n                    if (nocode.test(node.className)) { return; }\n                    for (var child = node.firstChild; child; child = child.nextSibling) {\n                        walk(child);\n                    }\n                    var nodeName = node.nodeName;\n                    if ('BR' === nodeName || 'LI' === nodeName) {\n                        chunks[k] = '\\n';\n                        spans[k << 1] = length++;\n                        spans[(k++ << 1) | 1] = node;\n                    }\n                    break;\n                case 3: case 4:  // Text\n                var text = node.nodeValue;\n                if (text.length) {\n                    if (!isPreformatted) {\n                        text = text.replace(/[ \\t\\r\\n]+/g, ' ');\n                    } else {\n                        text = text.replace(/\\r\\n?/g, '\\n');  // Normalize newlines.\n                    }\n                    // TODO: handle tabs here?\n                    chunks[k] = text;\n                    spans[k << 1] = length;\n                    length += text.length;\n                    spans[(k++ << 1) | 1] = node;\n                }\n                break;\n            }\n        }\n\n        walk(node);\n\n        return {\n            sourceCode: chunks.join('').replace(/\\n$/, ''),\n            spans: spans\n        };\n    }\n\n\n    /**\n     * Apply the given language handler to sourceCode and add the resulting\n     * decorations to out.\n     * @param {number} basePos the index of sourceCode within the chunk of source\n     *    whose decorations are already present on out.\n     */\n    function appendDecorations(basePos, sourceCode, langHandler, out) {\n        if (!sourceCode) { return; }\n        var job = {\n            sourceCode: sourceCode,\n            basePos: basePos\n        };\n        langHandler(job);\n        out.push.apply(out, job.decorations);\n    }\n\n    var notWs = /\\S/;\n\n    /**\n     * Given an element, if it contains only one child element and any text nodes\n     * it contains contain only space characters, return the sole child element.\n     * Otherwise returns undefined.\n     * <p>\n     * This is meant to return the CODE element in {@code <pre><code ...>} when\n     * there is a single child element that contains all the non-space textual\n     * content, but not to return anything where there are multiple child elements\n     * as in {@code <pre><code>...</code><code>...</code></pre>} or when there\n     * is textual content.\n     */\n    function childContentWrapper(element) {\n        var wrapper = undefined;\n        for (var c = element.firstChild; c; c = c.nextSibling) {\n            var type = c.nodeType;\n            wrapper = (type === 1)  // Element Node\n                ? (wrapper ? element : c)\n                : (type === 3)  // Text Node\n                ? (notWs.test(c.nodeValue) ? element : wrapper)\n                : wrapper;\n        }\n        return wrapper === element ? undefined : wrapper;\n    }\n\n    /** Given triples of [style, pattern, context] returns a lexing function,\n     * The lexing function interprets the patterns to find token boundaries and\n     * returns a decoration list of the form\n     * [index_0, style_0, index_1, style_1, ..., index_n, style_n]\n     * where index_n is an index into the sourceCode, and style_n is a style\n     * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to\n     * all characters in sourceCode[index_n-1:index_n].\n     *\n     * The stylePatterns is a list whose elements have the form\n     * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].\n     *\n     * Style is a style constant like PR_PLAIN, or can be a string of the\n     * form 'lang-FOO', where FOO is a language extension describing the\n     * language of the portion of the token in $1 after pattern executes.\n     * E.g., if style is 'lang-lisp', and group 1 contains the text\n     * '(hello (world))', then that portion of the token will be passed to the\n     * registered lisp handler for formatting.\n     * The text before and after group 1 will be restyled using this decorator\n     * so decorators should take care that this doesn't result in infinite\n     * recursion.  For example, the HTML lexer rule for SCRIPT elements looks\n     * something like ['lang-js', /<[s]cript>(.+?)<\\/script>/].  This may match\n     * '<script>foo()<\\/script>', which would cause the current decorator to\n     * be called with '<script>' which would not match the same rule since\n     * group 1 must not be empty, so it would be instead styled as PR_TAG by\n     * the generic tag rule.  The handler registered for the 'js' extension would\n     * then be called with 'foo()', and finally, the current decorator would\n     * be called with '<\\/script>' which would not match the original rule and\n     * so the generic tag rule would identify it as a tag.\n     *\n     * Pattern must only match prefixes, and if it matches a prefix, then that\n     * match is considered a token with the same style.\n     *\n     * Context is applied to the last non-whitespace, non-comment token\n     * recognized.\n     *\n     * Shortcut is an optional string of characters, any of which, if the first\n     * character, gurantee that this pattern and only this pattern matches.\n     *\n     * @param {Array} shortcutStylePatterns patterns that always start with\n     *   a known character.  Must have a shortcut string.\n     * @param {Array} fallthroughStylePatterns patterns that will be tried in\n     *   order if the shortcut ones fail.  May have shortcuts.\n     *\n     * @return {function (Object)} a\n     *   function that takes source code and returns a list of decorations.\n     */\n    function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {\n        var shortcuts = {};\n        var tokenizer;\n        (function () {\n            var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);\n            var allRegexs = [];\n            var regexKeys = {};\n            for (var i = 0, n = allPatterns.length; i < n; ++i) {\n                var patternParts = allPatterns[i];\n                var shortcutChars = patternParts[3];\n                if (shortcutChars) {\n                    for (var c = shortcutChars.length; --c >= 0;) {\n                        shortcuts[shortcutChars.charAt(c)] = patternParts;\n                    }\n                }\n                var regex = patternParts[1];\n                var k = '' + regex;\n                if (!regexKeys.hasOwnProperty(k)) {\n                    allRegexs.push(regex);\n                    regexKeys[k] = null;\n                }\n            }\n            allRegexs.push(/[\\0-\\uffff]/);\n            tokenizer = combinePrefixPatterns(allRegexs);\n        })();\n\n        var nPatterns = fallthroughStylePatterns.length;\n\n        /**\n         * Lexes job.sourceCode and produces an output array job.decorations of\n         * style classes preceded by the position at which they start in\n         * job.sourceCode in order.\n         *\n         * @param {Object} job an object like <pre>{\n         *    sourceCode: {string} sourceText plain text,\n         *    basePos: {int} position of job.sourceCode in the larger chunk of\n         *        sourceCode.\n         * }</pre>\n         */\n        var decorate = function (job) {\n            var sourceCode = job.sourceCode, basePos = job.basePos;\n            /** Even entries are positions in source in ascending order.  Odd enties\n             * are style markers (e.g., PR_COMMENT) that run from that position until\n             * the end.\n             * @type {Array.<number|string>}\n             */\n            var decorations = [basePos, PR_PLAIN];\n            var pos = 0;  // index into sourceCode\n            var tokens = sourceCode.match(tokenizer) || [];\n            var styleCache = {};\n\n            for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {\n                var token = tokens[ti];\n                var style = styleCache[token];\n                var match = void 0;\n\n                var isEmbedded;\n                if (typeof style === 'string') {\n                    isEmbedded = false;\n                } else {\n                    var patternParts = shortcuts[token.charAt(0)];\n                    if (patternParts) {\n                        match = token.match(patternParts[1]);\n                        style = patternParts[0];\n                    } else {\n                        for (var i = 0; i < nPatterns; ++i) {\n                            patternParts = fallthroughStylePatterns[i];\n                            match = token.match(patternParts[1]);\n                            if (match) {\n                                style = patternParts[0];\n                                break;\n                            }\n                        }\n\n                        if (!match) {  // make sure that we make progress\n                            style = PR_PLAIN;\n                        }\n                    }\n\n                    isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);\n                    if (isEmbedded && !(match && typeof match[1] === 'string')) {\n                        isEmbedded = false;\n                        style = PR_SOURCE;\n                    }\n\n                    if (!isEmbedded) { styleCache[token] = style; }\n                }\n\n                var tokenStart = pos;\n                pos += token.length;\n\n                if (!isEmbedded) {\n                    decorations.push(basePos + tokenStart, style);\n                } else {  // Treat group 1 as an embedded block of source code.\n                    var embeddedSource = match[1];\n                    var embeddedSourceStart = token.indexOf(embeddedSource);\n                    var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;\n                    if (match[2]) {\n                        // If embeddedSource can be blank, then it would match at the\n                        // beginning which would cause us to infinitely recurse on the\n                        // entire token, so we catch the right context in match[2].\n                        embeddedSourceEnd = token.length - match[2].length;\n                        embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;\n                    }\n                    var lang = style.substring(5);\n                    // Decorate the left of the embedded source\n                    appendDecorations(\n                        basePos + tokenStart,\n                        token.substring(0, embeddedSourceStart),\n                        decorate, decorations);\n                    // Decorate the embedded source\n                    appendDecorations(\n                        basePos + tokenStart + embeddedSourceStart,\n                        embeddedSource,\n                        langHandlerForExtension(lang, embeddedSource),\n                        decorations);\n                    // Decorate the right of the embedded section\n                    appendDecorations(\n                        basePos + tokenStart + embeddedSourceEnd,\n                        token.substring(embeddedSourceEnd),\n                        decorate, decorations);\n                }\n            }\n            job.decorations = decorations;\n        };\n        return decorate;\n    }\n\n    /** returns a function that produces a list of decorations from source text.\n     *\n     * This code treats \", ', and ` as string delimiters, and \\ as a string\n     * escape.  It does not recognize perl's qq() style strings.\n     * It has no special handling for double delimiter escapes as in basic, or\n     * the tripled delimiters used in python, but should work on those regardless\n     * although in those cases a single string literal may be broken up into\n     * multiple adjacent string literals.\n     *\n     * It recognizes C, C++, and shell style comments.\n     *\n     * @param {Object} options a set of optional parameters.\n     * @return {function (Object)} a function that examines the source code\n     *     in the input job and builds the decoration list.\n     */\n    function sourceDecorator(options) {\n        var shortcutStylePatterns = [], fallthroughStylePatterns = [];\n        if (options['tripleQuotedStrings']) {\n            // '''multi-line-string''', 'single-line-string', and double-quoted\n            shortcutStylePatterns.push(\n                [PR_STRING,  /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n                    null, '\\'\"']);\n        } else if (options['multiLineStrings']) {\n            // 'multi-line-string', \"multi-line-string\"\n            shortcutStylePatterns.push(\n                [PR_STRING,  /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n                    null, '\\'\"`']);\n        } else {\n            // 'single-line-string', \"single-line-string\"\n            shortcutStylePatterns.push(\n                [PR_STRING,\n                    /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n                    null, '\"\\'']);\n        }\n        if (options['verbatimStrings']) {\n            // verbatim-string-literal production from the C# grammar.  See issue 93.\n            fallthroughStylePatterns.push(\n                [PR_STRING, /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null]);\n        }\n        var hc = options['hashComments'];\n        if (hc) {\n            if (options['cStyleComments']) {\n                if (hc > 1) {  // multiline hash comments\n                    shortcutStylePatterns.push(\n                        [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);\n                } else {\n                    // Stop C preprocessor declarations at an unclosed open comment\n                    shortcutStylePatterns.push(\n                        [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\n                            null, '#']);\n                }\n                fallthroughStylePatterns.push(\n                    [PR_STRING,\n                        /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,\n                        null]);\n            } else {\n                shortcutStylePatterns.push([PR_COMMENT, /^#[^\\r\\n]*/, null, '#']);\n            }\n        }\n        if (options['cStyleComments']) {\n            fallthroughStylePatterns.push([PR_COMMENT, /^\\/\\/[^\\r\\n]*/, null]);\n            fallthroughStylePatterns.push(\n                [PR_COMMENT, /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n        }\n        if (options['regexLiterals']) {\n            /**\n             * @const\n             */\n            var REGEX_LITERAL = (\n                // A regular expression literal starts with a slash that is\n                // not followed by * or / so that it is not confused with\n                // comments.\n                '/(?=[^/*])'\n                    // and then contains any number of raw characters,\n                    + '(?:[^/\\\\x5B\\\\x5C]'\n                    // escape sequences (\\x5C),\n                    +    '|\\\\x5C[\\\\s\\\\S]'\n                    // or non-nesting character sets (\\x5B\\x5D);\n                    +    '|\\\\x5B(?:[^\\\\x5C\\\\x5D]|\\\\x5C[\\\\s\\\\S])*(?:\\\\x5D|$))+'\n                    // finally closed by a /.\n                    + '/');\n            fallthroughStylePatterns.push(\n                ['lang-regex',\n                    new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')\n                ]);\n        }\n\n        var types = options['types'];\n        if (types) {\n            fallthroughStylePatterns.push([PR_TYPE, types]);\n        }\n\n        var keywords = (\"\" + options['keywords']).replace(/^ | $/g, '');\n        if (keywords.length) {\n            fallthroughStylePatterns.push(\n                [PR_KEYWORD,\n                    new RegExp('^(?:' + keywords.replace(/[\\s,]+/g, '|') + ')\\\\b'),\n                    null]);\n        }\n\n        shortcutStylePatterns.push([PR_PLAIN,       /^\\s+/, null, ' \\r\\n\\t\\xA0']);\n        fallthroughStylePatterns.push(\n            // TODO(mikesamuel): recognize non-latin letters and numerals in idents\n            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],\n            [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/, null],\n            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],\n            [PR_LITERAL,\n                new RegExp(\n                    '^(?:'\n                        // A hex number\n                        + '0x[a-f0-9]+'\n                        // or an octal or decimal number,\n                        + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n                        // possibly in scientific notation\n                        + '(?:e[+\\\\-]?\\\\d+)?'\n                        + ')'\n                        // with an optional modifier like UL for unsigned long\n                        + '[a-z]*', 'i'),\n                null, '0123456789'],\n            // Don't treat escaped quotes in bash as starting strings.  See issue 144.\n            [PR_PLAIN,       /^\\\\[\\s\\S]?/, null],\n            [PR_PUNCTUATION, /^.[^\\s\\w\\.$@\\'\\\"\\`\\/\\#\\\\]*/, null]);\n\n        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);\n    }\n\n    var decorateSource = sourceDecorator({\n        'keywords': ALL_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n    });\n\n    /**\n     * Given a DOM subtree, wraps it in a list, and puts each line into its own\n     * list item.\n     *\n     * @param {Node} node modified in place.  Its content is pulled into an\n     *     HTMLOListElement, and each line is moved into a separate list item.\n     *     This requires cloning elements, so the input might not have unique\n     *     IDs after numbering.\n     */\n    function numberLines(node, opt_startLineNum) {\n        var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n        var lineBreak = /\\r\\n?|\\n/;\n\n        var document = node.ownerDocument;\n\n        var whitespace;\n        if (node.currentStyle) {\n            whitespace = node.currentStyle.whiteSpace;\n        } else if (window.getComputedStyle) {\n            whitespace = document.defaultView.getComputedStyle(node, null)\n                .getPropertyValue('white-space');\n        }\n        // If it's preformatted, then we need to split lines on line breaks\n        // in addition to <BR>s.\n        var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);\n\n        var li = document.createElement('LI');\n        while (node.firstChild) {\n            li.appendChild(node.firstChild);\n        }\n        // An array of lines.  We split below, so this is initialized to one\n        // un-split line.\n        var listItems = [li];\n\n        function walk(node) {\n            switch (node.nodeType) {\n                case 1:  // Element\n                    if (nocode.test(node.className)) { break; }\n                    if ('BR' === node.nodeName) {\n                        breakAfter(node);\n                        // Discard the <BR> since it is now flush against a </LI>.\n                        if (node.parentNode) {\n                            node.parentNode.removeChild(node);\n                        }\n                    } else {\n                        for (var child = node.firstChild; child; child = child.nextSibling) {\n                            walk(child);\n                        }\n                    }\n                    break;\n                case 3: case 4:  // Text\n                if (isPreformatted) {\n                    var text = node.nodeValue;\n                    var match = text.match(lineBreak);\n                    if (match) {\n                        var firstLine = text.substring(0, match.index);\n                        node.nodeValue = firstLine;\n                        var tail = text.substring(match.index + match[0].length);\n                        if (tail) {\n                            var parent = node.parentNode;\n                            parent.insertBefore(\n                                document.createTextNode(tail), node.nextSibling);\n                        }\n                        breakAfter(node);\n                        if (!firstLine) {\n                            // Don't leave blank text nodes in the DOM.\n                            node.parentNode.removeChild(node);\n                        }\n                    }\n                }\n                break;\n            }\n        }\n\n        // Split a line after the given node.\n        function breakAfter(lineEndNode) {\n            // If there's nothing to the right, then we can skip ending the line\n            // here, and move root-wards since splitting just before an end-tag\n            // would require us to create a bunch of empty copies.\n            while (!lineEndNode.nextSibling) {\n                lineEndNode = lineEndNode.parentNode;\n                if (!lineEndNode) { return; }\n            }\n\n            function breakLeftOf(limit, copy) {\n                // Clone shallowly if this node needs to be on both sides of the break.\n                var rightSide = copy ? limit.cloneNode(false) : limit;\n                var parent = limit.parentNode;\n                if (parent) {\n                    // We clone the parent chain.\n                    // This helps us resurrect important styling elements that cross lines.\n                    // E.g. in <i>Foo<br>Bar</i>\n                    // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.\n                    var parentClone = breakLeftOf(parent, 1);\n                    // Move the clone and everything to the right of the original\n                    // onto the cloned parent.\n                    var next = limit.nextSibling;\n                    parentClone.appendChild(rightSide);\n                    for (var sibling = next; sibling; sibling = next) {\n                        next = sibling.nextSibling;\n                        parentClone.appendChild(sibling);\n                    }\n                }\n                return rightSide;\n            }\n\n            var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);\n\n            // Walk the parent chain until we reach an unattached LI.\n            for (var parent;\n                // Check nodeType since IE invents document fragments.\n                 (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {\n                copiedListItem = parent;\n            }\n            // Put it on the list of lines for later processing.\n            listItems.push(copiedListItem);\n        }\n\n        // Split lines while there are lines left to split.\n        for (var i = 0;  // Number of lines that have been split so far.\n             i < listItems.length;  // length updated by breakAfter calls.\n             ++i) {\n            walk(listItems[i]);\n        }\n\n        // Make sure numeric indices show correctly.\n        if (opt_startLineNum === (opt_startLineNum|0)) {\n            listItems[0].setAttribute('value', opt_startLineNum);\n        }\n\n        var ol = document.createElement('OL');\n        ol.className = 'linenums';\n        var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;\n        for (var i = 0, n = listItems.length; i < n; ++i) {\n            li = listItems[i];\n            // Stick a class on the LIs so that stylesheets can\n            // color odd/even rows, or any other row pattern that\n            // is co-prime with 10.\n            li.className = 'L' + ((i + offset) % 10);\n            if (!li.firstChild) {\n                li.appendChild(document.createTextNode('\\xA0'));\n            }\n            ol.appendChild(li);\n        }\n\n        node.appendChild(ol);\n    }\n\n    /**\n     * Breaks {@code job.sourceCode} around style boundaries in\n     * {@code job.decorations} and modifies {@code job.sourceNode} in place.\n     * @param {Object} job like <pre>{\n     *    sourceCode: {string} source as plain text,\n     *    spans: {Array.<number|Node>} alternating span start indices into source\n     *       and the text node or element (e.g. {@code <BR>}) corresponding to that\n     *       span.\n     *    decorations: {Array.<number|string} an array of style classes preceded\n     *       by the position at which they start in job.sourceCode in order\n     * }</pre>\n     * @private\n     */\n    function recombineTagsAndDecorations(job) {\n        var isIE = /\\bMSIE\\b/.test(navigator.userAgent);\n        var newlineRe = /\\n/g;\n\n        var source = job.sourceCode;\n        var sourceLength = source.length;\n        // Index into source after the last code-unit recombined.\n        var sourceIndex = 0;\n\n        var spans = job.spans;\n        var nSpans = spans.length;\n        // Index into spans after the last span which ends at or before sourceIndex.\n        var spanIndex = 0;\n\n        var decorations = job.decorations;\n        var nDecorations = decorations.length;\n        // Index into decorations after the last decoration which ends at or before\n        // sourceIndex.\n        var decorationIndex = 0;\n\n        // Remove all zero-length decorations.\n        decorations[nDecorations] = sourceLength;\n        var decPos, i;\n        for (i = decPos = 0; i < nDecorations;) {\n            if (decorations[i] !== decorations[i + 2]) {\n                decorations[decPos++] = decorations[i++];\n                decorations[decPos++] = decorations[i++];\n            } else {\n                i += 2;\n            }\n        }\n        nDecorations = decPos;\n\n        // Simplify decorations.\n        for (i = decPos = 0; i < nDecorations;) {\n            var startPos = decorations[i];\n            // Conflate all adjacent decorations that use the same style.\n            var startDec = decorations[i + 1];\n            var end = i + 2;\n            while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {\n                end += 2;\n            }\n            decorations[decPos++] = startPos;\n            decorations[decPos++] = startDec;\n            i = end;\n        }\n\n        nDecorations = decorations.length = decPos;\n\n        var decoration = null;\n        while (spanIndex < nSpans) {\n            var spanStart = spans[spanIndex];\n            var spanEnd = spans[spanIndex + 2] || sourceLength;\n\n            var decStart = decorations[decorationIndex];\n            var decEnd = decorations[decorationIndex + 2] || sourceLength;\n\n            var end = Math.min(spanEnd, decEnd);\n\n            var textNode = spans[spanIndex + 1];\n            var styledText;\n            if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s\n                // Don't introduce spans around empty text nodes.\n                && (styledText = source.substring(sourceIndex, end))) {\n                // This may seem bizarre, and it is.  Emitting LF on IE causes the\n                // code to display with spaces instead of line breaks.\n                // Emitting Windows standard issue linebreaks (CRLF) causes a blank\n                // space to appear at the beginning of every line but the first.\n                // Emitting an old Mac OS 9 line separator makes everything spiffy.\n                if (isIE) { styledText = styledText.replace(newlineRe, '\\r'); }\n                textNode.nodeValue = styledText;\n                var document = textNode.ownerDocument;\n                var span = document.createElement('SPAN');\n                span.className = decorations[decorationIndex + 1];\n                var parentNode = textNode.parentNode;\n                parentNode.replaceChild(span, textNode);\n                span.appendChild(textNode);\n                if (sourceIndex < spanEnd) {  // Split off a text node.\n                    spans[spanIndex + 1] = textNode\n                        // TODO: Possibly optimize by using '' if there's no flicker.\n                        = document.createTextNode(source.substring(end, spanEnd));\n                    parentNode.insertBefore(textNode, span.nextSibling);\n                }\n            }\n\n            sourceIndex = end;\n\n            if (sourceIndex >= spanEnd) {\n                spanIndex += 2;\n            }\n            if (sourceIndex >= decEnd) {\n                decorationIndex += 2;\n            }\n        }\n    }\n\n\n    /** Maps language-specific file extensions to handlers. */\n    var langHandlerRegistry = {};\n    /** Register a language handler for the given file extensions.\n     * @param {function (Object)} handler a function from source code to a list\n     *      of decorations.  Takes a single argument job which describes the\n     *      state of the computation.   The single parameter has the form\n     *      {@code {\n     *        sourceCode: {string} as plain text.\n     *        decorations: {Array.<number|string>} an array of style classes\n     *                     preceded by the position at which they start in\n     *                     job.sourceCode in order.\n     *                     The language handler should assigned this field.\n     *        basePos: {int} the position of source in the larger source chunk.\n     *                 All positions in the output decorations array are relative\n     *                 to the larger source chunk.\n     *      } }\n     * @param {Array.<string>} fileExtensions\n     */\n    function registerLangHandler(handler, fileExtensions) {\n        for (var i = fileExtensions.length; --i >= 0;) {\n            var ext = fileExtensions[i];\n            if (!langHandlerRegistry.hasOwnProperty(ext)) {\n                langHandlerRegistry[ext] = handler;\n            } else if (window['console']) {\n                console['warn']('cannot override language handler %s', ext);\n            }\n        }\n    }\n    function langHandlerForExtension(extension, source) {\n        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {\n            // Treat it as markup if the first non whitespace character is a < and\n            // the last non-whitespace character is a >.\n            extension = /^\\s*</.test(source)\n                ? 'default-markup'\n                : 'default-code';\n        }\n        return langHandlerRegistry[extension];\n    }\n    registerLangHandler(decorateSource, ['default-code']);\n    registerLangHandler(\n        createSimpleLexer(\n            [],\n            [\n                [PR_PLAIN,       /^[^<?]+/],\n                [PR_DECLARATION, /^<!\\w[^>]*(?:>|$)/],\n                [PR_COMMENT,     /^<\\!--[\\s\\S]*?(?:-\\->|$)/],\n                // Unescaped content in an unknown language\n                ['lang-',        /^<\\?([\\s\\S]+?)(?:\\?>|$)/],\n                ['lang-',        /^<%([\\s\\S]+?)(?:%>|$)/],\n                [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],\n                ['lang-',        /^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],\n                // Unescaped content in javascript.  (Or possibly vbscript).\n                ['lang-js',      /^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],\n                // Contains unescaped stylesheet content\n                ['lang-css',     /^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],\n                ['lang-in.tag',  /^(<\\/?[a-z][^<>]*>)/i]\n            ]),\n        ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);\n    registerLangHandler(\n        createSimpleLexer(\n            [\n                [PR_PLAIN,        /^[\\s]+/, null, ' \\t\\r\\n'],\n                [PR_ATTRIB_VALUE, /^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/, null, '\\\"\\'']\n            ],\n            [\n                [PR_TAG,          /^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n                [PR_ATTRIB_NAME,  /^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],\n                ['lang-uq.val',   /^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],\n                [PR_PUNCTUATION,  /^[=<>\\/]+/],\n                ['lang-js',       /^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n                ['lang-js',       /^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],\n                ['lang-js',       /^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],\n                ['lang-css',      /^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n                ['lang-css',      /^style\\s*=\\s*\\'([^\\']+)\\'/i],\n                ['lang-css',      /^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]\n            ]),\n        ['in.tag']);\n    registerLangHandler(\n        createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\\s\\S]+/]]), ['uq.val']);\n    registerLangHandler(sourceDecorator({\n        'keywords': CPP_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'types': C_TYPES\n    }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);\n    registerLangHandler(sourceDecorator({\n        'keywords': 'null,true,false'\n    }), ['json']);\n    registerLangHandler(sourceDecorator({\n        'keywords': CSHARP_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'verbatimStrings': true,\n        'types': C_TYPES\n    }), ['cs']);\n    registerLangHandler(sourceDecorator({\n        'keywords': JAVA_KEYWORDS,\n        'cStyleComments': true\n    }), ['java']);\n    registerLangHandler(sourceDecorator({\n        'keywords': SH_KEYWORDS,\n        'hashComments': true,\n        'multiLineStrings': true\n    }), ['bsh', 'csh', 'sh']);\n    registerLangHandler(sourceDecorator({\n        'keywords': PYTHON_KEYWORDS,\n        'hashComments': true,\n        'multiLineStrings': true,\n        'tripleQuotedStrings': true\n    }), ['cv', 'py']);\n    registerLangHandler(sourceDecorator({\n        'keywords': PERL_KEYWORDS,\n        'hashComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n    }), ['perl', 'pl', 'pm']);\n    registerLangHandler(sourceDecorator({\n        'keywords': RUBY_KEYWORDS,\n        'hashComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n    }), ['rb']);\n    registerLangHandler(sourceDecorator({\n        'keywords': JSCRIPT_KEYWORDS,\n        'cStyleComments': true,\n        'regexLiterals': true\n    }), ['js']);\n    registerLangHandler(sourceDecorator({\n        'keywords': COFFEE_KEYWORDS,\n        'hashComments': 3,  // ### style block comments\n        'cStyleComments': true,\n        'multilineStrings': true,\n        'tripleQuotedStrings': true,\n        'regexLiterals': true\n    }), ['coffee']);\n    registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\\s\\S]+/]]), ['regex']);\n\n    function applyDecorator(job) {\n        var opt_langExtension = job.langExtension;\n\n        try {\n            // Extract tags, and convert the source code to plain text.\n            var sourceAndSpans = extractSourceSpans(job.sourceNode);\n            /** Plain text. @type {string} */\n            var source = sourceAndSpans.sourceCode;\n            job.sourceCode = source;\n            job.spans = sourceAndSpans.spans;\n            job.basePos = 0;\n\n            // Apply the appropriate language handler\n            langHandlerForExtension(opt_langExtension, source)(job);\n\n            // Integrate the decorations and tags back into the source code,\n            // modifying the sourceNode in place.\n            recombineTagsAndDecorations(job);\n        } catch (e) {\n            if ('console' in window) {\n                console['log'](e && e['stack'] ? e['stack'] : e);\n            }\n        }\n    }\n\n    /**\n     * @param sourceCodeHtml {string} The HTML to pretty print.\n     * @param opt_langExtension {string} The language name to use.\n     *     Typically, a filename extension like 'cpp' or 'java'.\n     * @param opt_numberLines {number|boolean} True to number lines,\n     *     or the 1-indexed number of the first line in sourceCodeHtml.\n     */\n    function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {\n        var container = document.createElement('PRE');\n        // This could cause images to load and onload listeners to fire.\n        // E.g. <img onerror=\"alert(1337)\" src=\"nosuchimage.png\">.\n        // We assume that the inner HTML is from a trusted source.\n        container.innerHTML = sourceCodeHtml;\n        if (opt_numberLines) {\n            numberLines(container, opt_numberLines);\n        }\n\n        var job = {\n            langExtension: opt_langExtension,\n            numberLines: opt_numberLines,\n            sourceNode: container\n        };\n        applyDecorator(job);\n        return container.innerHTML;\n    }\n\n    function prettyPrint(opt_whenDone) {\n        function byTagName(tn) { return document.getElementsByTagName(tn); }\n        // fetch a list of nodes to rewrite\n        var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];\n        var elements = [];\n        for (var i = 0; i < codeSegments.length; ++i) {\n            for (var j = 0, n = codeSegments[i].length; j < n; ++j) {\n                elements.push(codeSegments[i][j]);\n            }\n        }\n        codeSegments = null;\n\n        var clock = Date;\n        if (!clock['now']) {\n            clock = { 'now': function () { return +(new Date); } };\n        }\n\n        // The loop is broken into a series of continuations to make sure that we\n        // don't make the browser unresponsive when rewriting a large page.\n        var k = 0;\n        var prettyPrintingJob;\n\n        var langExtensionRe = /\\blang(?:uage)?-([\\w.]+)(?!\\S)/;\n        var prettyPrintRe = /\\bprettyprint\\b/;\n\n        function doWork() {\n            var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?\n                clock['now']() + 250 /* ms */ :\n                Infinity);\n            for (; k < elements.length && clock['now']() < endTime; k++) {\n                var cs = elements[k];\n                var className = cs.className;\n                if (className.indexOf('prettyprint') >= 0) {\n                    // If the classes includes a language extensions, use it.\n                    // Language extensions can be specified like\n                    //     <pre class=\"prettyprint lang-cpp\">\n                    // the language extension \"cpp\" is used to find a language handler as\n                    // passed to PR.registerLangHandler.\n                    // HTML5 recommends that a language be specified using \"language-\"\n                    // as the prefix instead.  Google Code Prettify supports both.\n                    // http://dev.w3.org/html5/spec-author-view/the-code-element.html\n                    var langExtension = className.match(langExtensionRe);\n                    // Support <pre class=\"prettyprint\"><code class=\"language-c\">\n                    var wrapper;\n                    if (!langExtension && (wrapper = childContentWrapper(cs))\n                        && \"CODE\" === wrapper.tagName) {\n                        langExtension = wrapper.className.match(langExtensionRe);\n                    }\n\n                    if (langExtension) {\n                        langExtension = langExtension[1];\n                    }\n\n                    // make sure this is not nested in an already prettified element\n                    var nested = false;\n                    for (var p = cs.parentNode; p; p = p.parentNode) {\n                        if ((p.tagName === 'pre' || p.tagName === 'code' ||\n                            p.tagName === 'xmp') &&\n                            p.className && p.className.indexOf('prettyprint') >= 0) {\n                            nested = true;\n                            break;\n                        }\n                    }\n                    if (!nested) {\n                        // Look for a class like linenums or linenums:<n> where <n> is the\n                        // 1-indexed number of the first line.\n                        var lineNums = cs.className.match(/\\blinenums\\b(?::(\\d+))?/);\n                        lineNums = lineNums\n                            ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true\n                            : false;\n                        if (lineNums) { numberLines(cs, lineNums); }\n\n                        // do the pretty printing\n                        prettyPrintingJob = {\n                            langExtension: langExtension,\n                            sourceNode: cs,\n                            numberLines: lineNums\n                        };\n                        applyDecorator(prettyPrintingJob);\n                    }\n                }\n            }\n            if (k < elements.length) {\n                // finish up in a continuation\n                setTimeout(doWork, 250);\n            } else if (opt_whenDone) {\n                opt_whenDone();\n            }\n        }\n\n        doWork();\n    }\n\n    /**\n     * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n     * {@code class=prettyprint} and prettify them.\n     *\n     * @param {Function?} opt_whenDone if specified, called when the last entry\n     *     has been finished.\n     */\n    window['prettyPrintOne'] = prettyPrintOne;\n    /**\n     * Pretty print a chunk of code.\n     *\n     * @param {string} sourceCodeHtml code as html\n     * @return {string} code as html, but prettier\n     */\n    window['prettyPrint'] = prettyPrint;\n    /**\n     * Contains functions for creating and registering new language handlers.\n     * @type {Object}\n     */\n    window['PR'] = {\n        'createSimpleLexer': createSimpleLexer,\n        'registerLangHandler': registerLangHandler,\n        'sourceDecorator': sourceDecorator,\n        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,\n        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,\n        'PR_COMMENT': PR_COMMENT,\n        'PR_DECLARATION': PR_DECLARATION,\n        'PR_KEYWORD': PR_KEYWORD,\n        'PR_LITERAL': PR_LITERAL,\n        'PR_NOCODE': PR_NOCODE,\n        'PR_PLAIN': PR_PLAIN,\n        'PR_PUNCTUATION': PR_PUNCTUATION,\n        'PR_SOURCE': PR_SOURCE,\n        'PR_STRING': PR_STRING,\n        'PR_TAG': PR_TAG,\n        'PR_TYPE': PR_TYPE\n    };\n})();\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <title>即时通讯示例--自动登录</title>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\r\n</head>\r\n<body>\r\n<script type=\"text/javascript\" src=\"js/jQuery-1.7.1.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"js/im.plus.js?skin=im\"></script>\r\n<script type=\"text/javascript\" src=\"js/jQuery.im.js\"></script>\r\n<script type=\"text/javascript\">\r\n    $(function() {\r\n         $(document).FnWebIM({\r\n             autoLogin          :true,      //boolean型，默认是否自动登录，true：自动登录，false：手动登录，默认为true\r\n             msgRefreshTime    :1000,       //number型，消息刷新时间，单位为ms\r\n             friendRefreshTime :10000,     //number型，好友刷新时间，单位为ms\r\n             showSecretary     :true,      //boolean型，默认是否显示小秘书，true：显示，false：不显示，默认为true\r\n             noticeContent     :\"唐僧师徒历经千辛万苦，终于见到了佛祖……\",        //string型，公告内容 为空时不显示公告\r\n             sendPicture       :true,      //boolean型，是否允许发送图片，true：允许，false：不允许，默认为true\r\n             msgMaxSize        :300,        //number型，单条消息最大允许字符\r\n             msgSound           :false,     //boolean型，是否开启声音提醒，true：开启，false:关闭，默认为true\r\n             defaultWindow     :\"\"   //string型，登录后打开新聊天窗口，此处接收的参数为联系人的uid，否则会出错\r\n         });\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "js/im.css",
    "content": "@charset \"utf-8\";\n*{margin:0;padding:0}\nimg{border: none;}\na,input.d-button{outline: none;outline: 0;hide-focus: expression( this.hideFocus=true );}\n*html{_background: url(about:blank) fixed;}\nbody { _margin:0; _height:100%; background: #fcfcfc}\n#fn_imbar{position: fixed;right:3px;bottom:0;padding:0 5px;_float:right;height:24px;line-height: 26px;overflow:hidden;border: solid 1px #ddd;border-bottom:none;background: url(\"../img/im_bg.png\") repeat-x 0 -798px;font-size: 12px;color:#666;cursor: pointer;}\n*html #fn_imbar{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));}\n#fn_imbar span{display: block;padding-left:20px;}\n#fn_imbar.im_loading span{background: url(\"../img/loading.gif\") no-repeat 0 6px;}\n#fn_imbar.im_login span{background: url(\"../img/newmsg.gif\") no-repeat 2px 6px;}\n#fn_imbar b{padding:0 5px;background: #c00;color:#fff;margin-left:3px;-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;font-weight: normal;line-height: 12px;overflow: hidden; }\n.d-outer { text-align:left; }\n.d-border, .d-dialog { border:0 none; margin:0; border-collapse:collapse; width:auto;}\n.d-nw, .d-n, .d-ne, .d-w, .d-c, .d-e, .d-sw, .d-s, .d-se, .d-header, .d-main, .d-footer { padding:0; }\n.d-title { overflow:hidden; text-overflow: ellipsis; cursor:default; font-family:tahoma,arial,\\5b8b\\4f53;}\n.d-state-noTitle .d-title { display:none; }\n.d-close { display:block; position:absolute; text-decoration:none; outline:none; _cursor:pointer; }\n.d-close:hover { text-decoration:none; }\n.d-main { text-align:center; vertical-align:middle; min-width:9em;font-family:tahoma,arial,\\5b8b\\4f53; }\n.d-content {font-size:12px; display:block\\0/*IE8 BUG*/; display:inline-block\\9\\0; *zoom:1; *display:inline; text-align:left; border:0 none;  }\n.d-content.d-state-full { display:block; width:100%; margin:0; padding:0!important; height:100%; }\n.d-loading { width:100%; height:32px; text-align:left; text-indent:-999em; overflow:hidden; background:url(../img/loading.gif) no-repeat center center; }\n.d-buttons { padding:5px 8px; text-align:right; white-space:nowrap; }\n.d-button { margin-left:8px; height:24px;line-height: 22px; padding:0 15px;+padding:0 5px;border:solid 1px #c1c8d1;background: url(\"../img/dialog.png\") repeat-x 0 -61px;border-radius: 2px;color: #333;cursor: pointer;}\n.d-button:focus { outline:none 0 !important;  }\n.d-button:hover { color:#000; border-color:#e8cca0; background-position: 0 -92px;}\n.d-button:active {border-color:#7494c4;outline:none 0 !important; }\n.d-button[disabled],.d-button[disabled]:hover { cursor:default; color:#999;}\n.d-state-highlight { color: #000; border: 1px solid #a1badf;}\n.d-state-highlight:hover { border-color:#7494c4; }\n.d-state-highlight:active { border-color:#999; }\n.d-input-text{width:338px;padding:3px 5px;border:solid 1px #b7b7b7;outline: none;color:#666;font-family:tahoma,arial,\\5b8b\\4f53;margin-top:3px;}\n.d-input-text:focus{border:solid 1px #999;}\n.d-mask { background:#fff; filter:alpha(opacity=20);-moz-opacity:0.2;  opacity:0.2; }\n.d-inner { background:#FFF;}\n.d-outer{ border:1px solid #b7b7b7;border-top:solid 2px #000;}\n.d-state-lock .d-nw, .d-state-lock .d-n, .d-state-lock .d-ne, .d-state-lock .d-w, .d-state-lock .d-e, .d-state-lock .d-sw, .d-state-lock .d-s, .d-state-lock .d-se { background:rgba(0, 0, 0, .5); background:#999\\9!important; filter:alpha(opacity=50);}\n.d-title { height:29px; line-height:28px; padding:0 28px 0 15px; background: url(\"../img/dialog.png\") repeat-x 0 -28px; border-bottom:1px solid #b7b7b7;color:#333!important;font-size:12px;font-weight: bold;}\n.d-state-drag .d-title,.d-state-drag .d-titleBar { box-shadow:none; }\n.d-close { padding:0; top:8px; right:8px; width:17px; height:17px;background: url(\"../img/dialog.png\") no-repeat 2px 2px;overflow: hidden; }\n.d-close:hover {color:#C00;margin:-1px;background-color:#fff;border: solid 1px #ced5e0; }\n.d-content { color:#666; }\n.d-state-focus{background: #fff;}\n.d-state-focus .d-content { color:#333; }\n.d-buttons { background-color:#fcfcfc;  }\n.d-nw, .d-n, .d-ne, .d-w, .d-e, .d-sw, .d-s, .d-se { display:none; }\n#fn_imbox{display:none;border-left:solid 1px #313131;border-top:solid 2px #000;font-size:12px;position:fixed;bottom:0;right:0;width:180px;height:360px;background: #fff; font-family:tahoma,arial,\\5b8b\\4f53;z-index: 1;}\n*html #fn_imbox{position:absolute;bottom:auto;right:-1px;top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));}\n#fn_imbox .im_top{height:31px;background: url(\"../img/im_bg.png\") repeat-x 0 -867px;position: relative;z-index: 1;}\n#fn_imbox .im_top a.cc{display: block;height:8px;background: url(\"../img/im_bg.png\") no-repeat center -678px;overflow: hidden; }\n#fn_imbox .im_top a:hover{background-position:  center -717px; }\n#fn_imbox .im_top h4{font-size:12px;font-weight:normal;color:#fff;padding-left:30px; background: url(\"../img/im_bg.png\") no-repeat 11px -761px;float: left;width:126px;height:22px;cursor: pointer;}\n#fn_imbox .im_top a.modify{text-decoration: none;color:#fff;display:inline-block;width:14px;margin-right:5px;background: url(\"../img/m_ico.png\") no-repeat 0 -148px;float: right;}\n#fn_imbox .im_top a.modify:hover{background-position:  0 -167px;}\n#fn_imbox .im_contents{height:303px;_height:326px;}\n#fn_imbox .im_contents .hide{display: none;}\n#fn_imbox .im_contents h4{border-bottom:solid 1px #b7b7b7;padding-left:20px;color:#717171;height:24px;line-height: 22px;cursor: pointer;font-weight: normal;margin-top:1px;font-size:12px;}\n#fn_imbox .im_contents h4 i{color:#999;font-style: normal;margin-left:5px;}\n#fn_imbox .im_group_expansion{background:url(\"../img/im_bg.png\") no-repeat 6px -346px #f3f3f3; }\n#fn_imbox .im_group_expansion:hover{background-position: 6px -365px; color:#333;}\n#fn_imbox .im_group_away{background:url(\"../img/im_bg.png\") no-repeat 6px -386px #f3f3f3; }\n#fn_imbox .im_group_away:hover{background-position: 6px -408px; color:#333;}\n#fn_imbox .im_group_contacts{height:253px;overflow: hidden;margin-bottom:1px;border-bottom:solid 1px #b7b7b7;_width:180px;_height:251px;}\n#fn_imbox .im_contact{padding:8px;height: 30px;overflow: hidden;width: 175px;-moz-user-select:   none;cursor: default;}\n#fn_imbox .im_contact:hover{background: #fafafa;}\n#fn_imbox .current{background: #f7f7f7;}\n#fn_imbox .im_contact i{float: left;display: block;width:30px;height: 30px;overflow: hidden;-moz-border-radius:2px;-khtml-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;}\n#fn_imbox .im_contact.offline i img{width:30px;height: 30px;FILTER: gray;-webkit-filter: grayscale(100%); }\n#fn_imbox .im_contact.offline:hover i img{FILTER:;-webkit-filter: grayscale(0);}\n#fn_imbox .im_contact sup{display:block;width:5px;height:5px;position: absolute;margin:-8px 0 0 24px;border:solid 1px #fff; +margin:24px 0 0 -6px;overflow: hidden;}\n#fn_imbox .im_contact.online sup{background: green;}\n#fn_imbox .im_contact.offline sup{background: #ddd;}\n#fn_imbox .im_contact span{float:left;display:block;width:100px;height:30px;line-height:30px;overflow:hidden;padding:0 10px;color:#555;}\n#fn_imbox .im_contact b{display: inline-block;width:21px;height:12px;background: url(\"../img/new.gif\") no-repeat;margin-left:5px;}\n#fn_imbox .im_group_contacts a{float: left;display: block;width: 10px;height:10px;background: url(\"../img/im_bg.png\") no-repeat 0 -450px;margin-top:11px;}\n#fn_imbox .im_group_contacts a:hover{background-position: 0 -480px;}\n#fn_imbox .im_bottombar{background:url(\"../img/im_bg.png\") repeat-x 0 -799px;height:25px;line-height: 25px;position: absolute;z-index: 1;width: 180px;border-top:solid 1px #b7b7b7;_margin-top:-23px;}\n#fn_imbox .im_bottombar input{float: left;background:transparent url(\"../img/im_bg.png\") no-repeat 7px -581px;border: none 0;height:25px;line-height:26px;padding:0 0 0 20px;color:#666;width: 134px;outline: none;}\n#fn_imbox .im_bottombar span{float: left;display: block;width:25px;height:25px;background:url(\"../img/im_bg.png\") no-repeat 6px -611px;border-left:solid 1px #b7b7b7;cursor: pointer; }\n#fn_imbox .im_bottombar span:hover, #fn_imbox .im_bottombar span.current{background-position:6px -641px; }\n#fn_imbox .im_bottombar ul{position: fixed;padding:10px 0;border-top:2px solid #000;right:0;bottom:25px;background: #fff;display: none;z-index: 2;_position: absolute;+bottom:26px; }\n#fn_imbox .im_bottombar li{list-style: none;padding:0 15px 0 28px;line-height: 22px;color:#666;height:24px;cursor: pointer;width: 84px;width: 137px;+line-height:26px;_line-height: 22px;overflow: hidden;}\n#fn_imbox .im_bottombar li.selected{background: url(\"../img/im_bg.png\") no-repeat 10px -508px;}\n#fn_imbox .im_bottombar li.selected.current{background: url(\"../img/im_bg.png\") no-repeat 10px -552px;}\n#fn_imbox .im_bottombar li:hover{background-color: #f0f2f5 !important;}\n#fn_imbox .im_bottombar li.setting{background:url(\"../img/im_bg.png\") no-repeat 10px -612px;}\n#fn_imbox .im_bottombar li.backlist{background:url(\"../img/m_ico.png\") no-repeat 10px 7px;}\n#fn_imbox .im_bottombar li.friends{background:url(\"../img/m_ico.png\") no-repeat 10px -67px;}\n#fn_imbox .im_bottombar li.help{background:url(\"../img/m_ico.png\") no-repeat 10px -94px;}\n#fn_imbox .im_bottombar li.loginout{background:url(\"../img/im_bg.png\") no-repeat 10px -1307px;}\n#fn_imbox .im_bottombar li.loginout:hover{background-position:10px -1332px;}\n#fn_imbox .im_top h4.im_newmsg{background:url(\"../img/msg.gif\") no-repeat 10px 1px;}\n.im_contactinfobar{margin-left:-8px;font-family:tahoma,arial,\\5b8b\\4f53;}\n.im_contactinfobar a.im_avatar{display: block;position: absolute;+position:relative;float:left;width:50px;height:50px;padding:3px;border: #b7b7b7 solid 1px;background: #fff;margin-top:-25px;z-index: 2;}\n.im_contactinfobar a.im_avatar:hover{border-color:#999; }\n.im_contactinfobar a.im_avatar.offline img{width:50px;height: 50px;FILTER: gray;-webkit-filter: grayscale(100%); }\n.im_contactinfobar a.im_avatar.offline:hover img{FILTER:;-webkit-filter: grayscale(0);}\n.im_contactinfobar .im_contactinfo{float: left;margin-left:66px;+margin-left:10px;}\n.im_contactinfobar .im_contactinfo a{color:#555;text-decoration: none;font-weight: normal;}\n.im_contactinfobar .im_contactinfo a:hover{color:#333;text-decoration: underline;}\n.im_contactinfobar .im_contactinfo a#imcontact{padding:6px;display:inline;}\n.im_contactinfobar .im_contactinfo a.im_addcontact{background: url(\"../img/im_bg.png\") no-repeat 0 -907px;}\n.im_contactinfobar .im_contactinfo a.im_addcontact:hover{background-position: 0 -934px;text-decoration: none;}\n.im_contactinfobar .im_contactinfo a.im_removecontact{background: url(\"../img/im_bg.png\") no-repeat 0 -1103px;}\n.im_contactinfobar .im_contactinfo a.im_removecontact:hover{background-position: 0 -1130px;text-decoration: none;}\n.im_contactinfobar .im_contactinfo a.im_contact{padding-right:20px;background: url(\"../img/im_bg.png\") no-repeat right -150px;}\n.im_contactinfobar .im_contactinfo a.im_contact:hover{background-position: right -167px;}\n#im_window{width:400px;+height:328px;background: #fff;font-size:12px;font-family:tahoma,arial,\\5b8b\\4f53;overflow: hidden;}\n#im_window #im_body{float: left;width: 400px;}\n#im_window .im_chats{height:240px;overflow:hidden;border-bottom: solid 1px #b7b7b7;width:100%;}\n#im_window .im_notice{width:100%;float:left;line-height: 16px;background: #fffbe2;color:#777;}\n#im_window .im_notice span{display: block;width: 89%;padding:4px 0 4px 24px;background:url(\"../img/im_bg.png\") no-repeat 7px -191px;float: left;}\n#im_window a.im_notice_close{display: block;width: 12px;height: 12px;background: url(\"../img/im_bg.png\") no-repeat 0 -103px;float: right;margin:7px 6px 0 0;}\n#im_window a.im_notice_close:hover{background-position: 0 -124px;}\n#im_window a.im_morechats{display: block;text-align: center;line-height: 24px;color:#999;text-decoration: none;}\n#im_window a.im_morechats:hover{color:#666;background: #fcfcfc;}\n#im_window .im_chat_content{padding:3px 10px;background: #fcfcfc;border-top:solid 1px #f1f1f1;clear: both;}\n#im_window .im_chat_content i{font-style:normal;color:#999; }\n#im_window .im_chat_content a.fn_url{padding-right:20px;background: url(\"../img/im_bg.png\") no-repeat right -1035px;line-height: 16px; }\n#im_window .im_chat_content .im_chat_txt{color:#555;line-height: 16px;padding:3px 0 5px 0;word-break: break-all;}\n#im_window .im_chat_content .im_chat_txt em{color:#666;font-style: normal;display: block;background:url(\"../img/im_bg.png\") no-repeat 0 -196px;padding-left:18px;}\n#im_window .im_chat_content .im_chat_txt img{max-width: 380px;_width: expression(this.width> 380 ? 380 : true);}\n#im_window .im_chat_content.myself{background: #fff;border-top:none;}\n#im_window .im_send_msg{height:49px;padding:5px;line-height: 16px;overflow: hidden;outline:none; cursor: text;}\n#im_window .im_operatebar{background: #f5f6f7;height:30px;+position: absolute;width: 400px;}\n#im_window .im_operatebars{background: #f5f6f7;height:30px;}\n#im_window a.im_operates{display: block;width:16px;height:16px;float: left;margin:7px 0 0 7px;}\n#im_window a.im_face{background: url(\"../img/im_bg.png\") no-repeat 0 -257px;}\n#im_window a.im_face:hover{background-position:0 -278px;}\n#im_window a.im_upload_pic{background: url(\"../img/im_bg.png\") no-repeat 0 -301px;overflow: hidden;}\n#im_window a.im_upload_pic:hover{background-position:0 -321px;}\n#im_window a.im_shake{background: url(\"../img/im_bg.png\") no-repeat 0 -40px;}\n#im_window a.im_shake:hover{background-position:0 -61px;}\n#im_window a.im_product{background: url(\"../img/im_bg.png\") no-repeat 0 -1174px;}\n#im_window a.im_product:hover{background-position:0 -1200px;}\n#im_window a.im_card{background: url(\"../img/im_bg.png\") no-repeat 0 -1224px;}\n#im_window a.im_card:hover{background-position:0 -1250px;}\n#im_window a.im_moreoperates{background: url(\"../img/im_bg.png\") no-repeat 2px -1361px;}\n#im_window a.im_moreoperates:hover{background-position:2px -1385px;}\n#im_window .im_moreoperate{position: absolute;background:#fbfbfb;line-height: 26px;width: 400px; height:0;overflow: hidden;}\n#im_window .im_moreoperate a{color:#888;text-decoration: none; float: left;padding-left:15px;margin-left:8px;}\n#im_window .im_moreoperate a:hover{color:#666;}\n#im_window .im_moreoperate a.im_abacklist{background: url(\"../img/m_ico.png\") no-repeat 0 9px;}\n#im_window .im_moreoperate a.im_areport{background: url(\"../img/m_ico.png\") no-repeat 0 -15px;}\n#im_window .im_moreoperate a.im_aemptyrecords{background: url(\"../img/m_ico.png\") no-repeat 1px -40px;}\n#im_window .im_moreoperate a.im_aclose{float: right;margin-right:6px;font-size:16px;}\n#im_window .im_operatebar i{float: right;line-height: 30px;white-space:nowrap;color:#999;font-style: normal;_margin-top:-25px;}\n#im_window .im_operatebar a.im_sendmsg_btn{display:block;width:64px;height:22px;margin:4px 5px 0 7px;float: right;background: url(\"../img/sendmsg.png\") no-repeat;}\n#im_window .im_operatebar a.im_sendmsg_btn:hover{background-position: 0 bottom;}\n#im_face{display:none;position: absolute;margin:-193px 0 0 -1px;z-index:3;border:solid 1px #b7b7b7;width:400px;height:190px;font-size: 12px;overflow: hidden;background:#fff url(\"../img/loading.gif\") no-repeat center center;}\n#im_window #im_contactinfo{position:absolute;width: 199px;height:360px;+height:361px;display: none;border:solid 1px #b7b7b7;border-top:2px #000 solid;margin:-32px 0 0 400px;+margin:-33px 0 0 0;}\n#im_window .im_contactinfobar{height:29px;line-height: 29px;background: url(\"../img/im_bg.png\") repeat-x;border-bottom: solid 1px #b7b7b7;padding:0 7px;margin:0;+margin-top:1px;}\n#im_window .im_contactinfobar a.d-close{margin-top:-2px;}\n#im_window .im_contactinfobar a.d-close:hover{margin-top:-3px;}\n#im_window .im_contactinfos{height: 300px;overflow:hidden;background:#fff url(\"../img/loading.gif\") no-repeat center center;}\n#im_window .im_contactgohome{line-height: 30px;float: right;padding-left:13px;color:#999;margin-right:7px;text-decoration: none;background: url(\"../img/im_bg.png\") no-repeat 0 -962px;+line-height: 34px;_line-height:30px;}\n#im_window .im_contactgohome:hover{color:#666;background-position: 0 -992px;}\n.im_infos{margin:-2px;background: url(\"../img/i.png\") repeat-x center center;border:solid 2px #000;-moz-border-radius:2px;-khtml-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;}\n.im_infos p{padding:20px 25px 20px 60px;background: url(\"../img/i_ico.png\") no-repeat 20px 12px;color:#555; }\n\n\n#im_msgbox .d-content{height:240px;}"
  },
  {
    "path": "js/im.plus.js",
    "content": "﻿(function(g,h){function i(a){var c=f.expando,d=a===g?0:a[c];d===h&&(a[c]=d=++f.uuid);return d}var f=g.art=function(a,c){return new f.fn.constructor(a,c)},p=/^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]+)$)/,o=/[\\n\\t]/g;if(g.$===h)g.$=f;f.fn=f.prototype={constructor:function(a,c){var d,c=c||document;if(!a)return this;if(a.nodeType)return this[0]=a,this;if(\"string\"===typeof a&&(d=p.exec(a))&&d[2])return(d=c.getElementById(d[2]))&&d.parentNode&&(this[0]=d),this;this[0]=a;return this},hasClass:function(a){return-1<\n    (\" \"+this[0].className+\" \").replace(o,\" \").indexOf(\" \"+a+\" \")?!0:!1},addClass:function(a){this.hasClass(a)||(this[0].className+=\" \"+a);return this},removeClass:function(a){var c=this[0];if(a){if(this.hasClass(a))c.className=c.className.replace(a,\" \")}else c.className=\"\";return this},css:function(a,c){var d,e=this[0];if(\"string\"===typeof a){if(c===h)return f.css(e,a);e.style[a]=c}else for(d in a)e.style[d]=a[d];return this},show:function(){return this.css(\"display\",\"block\")},hide:function(){return this.css(\"display\",\n    \"none\")},offset:function(){var a=this[0],c=a.getBoundingClientRect(),d=a.ownerDocument,a=d.body,d=d.documentElement;return{left:c.left+(self.pageXOffset||d.scrollLeft)-(d.clientLeft||a.clientLeft||0),top:c.top+(self.pageYOffset||d.scrollTop)-(d.clientTop||a.clientTop||0)}},html:function(a){var c=this[0];if(a===h)return c.innerHTML;f.cleanData(c.getElementsByTagName(\"*\"));c.innerHTML=a;return this},remove:function(){var a=this[0];f.cleanData(a.getElementsByTagName(\"*\"));f.cleanData([a]);a.parentNode.removeChild(a);\n    return this},bind:function(a,c){f.event.add(this[0],a,c);return this},unbind:function(a,c){f.event.remove(this[0],a,c);return this}};f.fn.constructor.prototype=f.fn;f.isWindow=function(a){return a&&\"object\"===typeof a&&\"setInterval\"in a};f.fn.find=function(a){var c=this[0],d=a.split(\".\")[1];if(d)if(document.getElementsByClassName)d=c.getElementsByClassName(d);else{for(var e=a=0,b=[],c=(c||document).getElementsByTagName(\"*\"),m=c.length,d=RegExp(\"(^|\\\\s)\"+d+\"(\\\\s|$)\");a<m;a++)d.test(c[a].className)&&\n(b[e]=c[a],e++);d=b}else d=c.getElementsByTagName(a);return f(d[0])};f.each=function(a,c){var d,e=0,b=a.length;if(b===h)for(d in a){if(!1===c.call(a[d],d,a[d]))break}else for(d=a[0];e<b&&!1!==c.call(d,e,d);d=a[++e]);return a};f.data=function(a,c,d){var e=f.cache,a=i(a);if(c===h)return e[a];e[a]||(e[a]={});d!==h&&(e[a][c]=d);return e[a][c]};f.removeData=function(a,c){var d=!0,e=f.expando,b=f.cache,m=i(a),n=m&&b[m];if(n)if(c){delete n[c];for(var k in n)d=!1;d&&delete f.cache[m]}else delete b[m],a.removeAttribute?\n    a.removeAttribute(e):a[e]=null};f.uuid=0;f.cache={};f.expando=\"@cache\"+ +new Date;f.event={add:function(a,c,d){var j;var e,b=f.event;e=f.data(a,\"@events\")||f.data(a,\"@events\",{});j=e[c]=e[c]||{},e=j;(e.listeners=e.listeners||[]).push(d);if(!e.handler)e.elem=a,e.handler=b.handler(e),a.addEventListener?a.addEventListener(c,e.handler,!1):a.attachEvent(\"on\"+c,e.handler)},remove:function(a,c,d){var e,b,m;b=f.event;var n=!0,k=f.data(a,\"@events\");if(k)if(c){if(b=k[c]){m=b.listeners;if(d)for(e=0;e<m.length;e++)m[e]===\n    d&&m.splice(e--,1);else b.listeners=[];if(0===b.listeners.length){a.removeEventListener?a.removeEventListener(c,b.handler,!1):a.detachEvent(\"on\"+c,b.handler);delete k[c];b=f.data(a,\"@events\");for(var r in b)n=!1;n&&f.removeData(a,\"@events\")}}}else for(e in k)b.remove(a,e)},handler:function(a){return function(c){for(var c=f.event.fix(c||g.event),d=0,e=a.listeners,b;b=e[d++];)!1===b.call(a.elem,c)&&(c.preventDefault(),c.stopPropagation())}},fix:function(a){if(a.target)return a;var c={target:a.srcElement||\n    document,preventDefault:function(){a.returnValue=!1},stopPropagation:function(){a.cancelBubble=!0}},d;for(d in a)c[d]=a[d];return c}};f.cleanData=function(a){for(var c=0,d,e=a.length,b=f.event.remove,m=f.removeData;c<e;c++)d=a[c],b(d),m(d)};f.css=\"defaultView\"in document&&\"getComputedStyle\"in document.defaultView?function(a,c){return document.defaultView.getComputedStyle(a,!1)[c]}:function(a,c){return a.currentStyle[c]||\"\"};f.each([\"Left\",\"Top\"],function(a,c){var d=\"scroll\"+c;f.fn[d]=function(){var c=\n    this[0],b;return(b=f.isWindow(c)?c:9===c.nodeType?c.defaultView||c.parentWindow:!1)?\"pageXOffset\"in b?b[a?\"pageYOffset\":\"pageXOffset\"]:b.document.documentElement[d]||b.document.body[d]:c[d]}});f.each([\"Height\",\"Width\"],function(a,c){var d=c.toLowerCase();f.fn[d]=function(a){var b=this[0];return!b?null==a?null:this:f.isWindow(b)?b.document.documentElement[\"client\"+c]||b.document.body[\"client\"+c]:9===b.nodeType?Math.max(b.documentElement[\"client\"+c],b.body[\"scroll\"+c],b.documentElement[\"scroll\"+c],\n    b.body[\"offset\"+c],b.documentElement[\"offset\"+c]):null}});return f})(window);\n(function(g,h,i){if(\"BackCompat\"===document.compatMode)throw Error(\"artDialog: Document types require more than xhtml1.0\");var f,p=0,o=\"artDialog\"+ +new Date,a=h.VBArray&&!h.XMLHttpRequest,c=\"createTouch\"in document&&!(\"onmousemove\"in document)||/(iPhone|iPad|iPod)/i.test(navigator.userAgent),d=!a&&!c,e=function(b,a,n){b=b||{};if(\"string\"===typeof b||1===b.nodeType)b={content:b,fixed:!c};var k;k=e.defaults;var r=b.follow=1===this.nodeType&&this||b.follow,t;for(t in k)b[t]===i&&(b[t]=k[t]);b.id=r&&\n    r[o+\"follow\"]||b.id||o+p;if(k=e.list[b.id])return r&&k.follow(r),k.zIndex().focus(),k;if(!d)b.fixed=!1;if(!b.button||!b.button.push)b.button=[];if(a!==i)b.ok=a;b.ok&&b.button.push({id:\"ok\",value:b.okValue,callback:b.ok,focus:!0});if(n!==i)b.cancel=n;b.cancel&&b.button.push({id:\"cancel\",value:b.cancelValue,callback:b.cancel});e.defaults.zIndex=b.zIndex;p++;return e.list[b.id]=f?f.constructor(b):new e.fn.constructor(b)};e.version=\"5.0\";e.fn=e.prototype={constructor:function(b){var a;this.closed=!1;\n    this.config=b;this.dom=a=this.dom||this._getDom();b.skin&&a.wrap.addClass(b.skin);a.wrap.css(\"position\",b.fixed?\"fixed\":\"absolute\");a.close[!1===b.cancel?\"hide\":\"show\"]();a.content.css(\"padding\",b.padding);this.button.apply(this,b.button);this.title(b.title).content(b.content).size(b.width,b.height).time(b.time);b.follow?this.follow(b.follow):this.position();this.zIndex();b.lock&&this.lock();this._addEvent();this[b.visible?\"visible\":\"hidden\"]().focus();f=null;b.initialize&&b.initialize.call(this);\n    return this},content:function(b){var a,c,e,d,f=this,v=this.dom.content,l=v[0];this._elemBack&&(this._elemBack(),delete this._elemBack);if(\"string\"===typeof b)v.html(b);else if(b&&1===b.nodeType)d=b.style.display,a=b.previousSibling,c=b.nextSibling,e=b.parentNode,this._elemBack=function(){a&&a.parentNode?a.parentNode.insertBefore(b,a.nextSibling):c&&c.parentNode?c.parentNode.insertBefore(b,c):e&&e.appendChild(b);b.style.display=d;f._elemBack=null},v.html(\"\"),l.appendChild(b),g(b).show();return this.position()},\n    title:function(b){var a=this.dom,c=a.outer,a=a.title;!1===b?(a.hide().html(\"\"),c.addClass(\"d-state-noTitle\")):(a.show().html(b),c.removeClass(\"d-state-noTitle\"));return this},position:function(){var b=this.dom,a=b.wrap[0],c=b.window,e=b.document,d=this.config.fixed,b=d?0:e.scrollLeft(),e=d?0:e.scrollTop(),d=c.width(),f=c.height(),g=a.offsetHeight,c=(d-a.offsetWidth)/2+b,d=d=(g<4*f/7?0.382*f-g/2:(f-g)/2)+e,a=a.style;a.left=Math.max(c,b)+\"px\";a.top=Math.max(d,e)+\"px\";return this},size:function(b,a){var c=\n        this.dom.main[0].style;\"number\"===typeof b&&(b+=\"px\");\"number\"===typeof a&&(a+=\"px\");c.width=b;c.height=a;return this},follow:function(b){var a=g(b),c=this.config;if(!b||!b.offsetWidth&&!b.offsetHeight)return this.position(this._left,this._top);var d=c.fixed,e=o+\"follow\",f=this.dom,h=f.window,l=f.document,f=h.width(),h=h.height(),s=l.scrollLeft(),l=l.scrollTop(),j=a.offset(),a=b.offsetWidth,i=d?j.left-s:j.left,j=d?j.top-l:j.top,q=this.dom.wrap[0],p=q.style,u=q.offsetWidth,q=q.offsetHeight,w=i-(u-\n        a)/2,x=j+b.offsetHeight,s=d?0:s,d=d?0:l;p.left=(w<s?i:w+u>f&&i-u>s?i-u+a:w)+\"px\";p.top=(x+q>h+d&&j-q>d?j-q:x)+\"px\";this._follow&&this._follow.removeAttribute(e);this._follow=b;b[e]=c.id;return this},button:function(){for(var b=this.dom.buttons,a=b[0],c=this._listeners=this._listeners||{},d=[].slice.call(arguments),e=0,f,h,l,i,j;e<d.length;e++){f=d[e];h=f.value;l=f.id||h;i=!c[l];j=!i?c[l].elem:document.createElement(\"input\");j.type=\"button\";j.className=\"d-button\";c[l]||(c[l]={});if(h)j.value=h;if(f.width)j.style.width=\n        f.width;if(f.callback)c[l].callback=f.callback;if(f.focus)this._focus&&this._focus.removeClass(\"d-state-highlight\"),this._focus=g(j).addClass(\"d-state-highlight\"),this.focus();j[o+\"callback\"]=l;j.disabled=!!f.disabled;if(i)c[l].elem=j,a.appendChild(j)}b[0].style.display=d.length?\"\":\"none\";return this},visible:function(){this.dom.wrap.css(\"visibility\",\"visible\");this.dom.outer.addClass(\"d-state-visible\");this._isLock&&this._lockMask.show();return this},hidden:function(){this.dom.wrap.css(\"visibility\",\n        \"hidden\");this.dom.outer.removeClass(\"d-state-visible\");this._isLock&&this._lockMask.hide();return this},close:function(){if(this.closed)return this;var b=this.dom,a=b.wrap,c=e.list,k=this.config.beforeunload,g=this.config.follow;if(k&&!1===k.call(this))return this;if(e.focus===this)e.focus=null;g&&g.removeAttribute(o+\"follow\");this._elemBack&&this._elemBack();this.time();this.unlock();this._removeEvent();delete c[this.config.id];if(f)a.remove();else{f=this;b.title.html(\"\");b.content.html(\"\");b.buttons.html(\"\");\n        a[0].className=a[0].style.cssText=\"\";b.outer[0].className=\"d-outer\";a.css({left:0,top:0,position:d?\"fixed\":\"absolute\"});for(var h in this)this.hasOwnProperty(h)&&\"dom\"!==h&&delete this[h];this.hidden()}this.closed=!0;return this},time:function(b){var a=this,c=this._timer;c&&clearTimeout(c);if(b)this._timer=setTimeout(function(){a._click(\"cancel\")},b);return this},focus:function(){if(this.config.focus)try{var b=this._focus&&this._focus[0]||this.dom.close[0];b&&b.focus()}catch(a){}return this},zIndex:function(){var b=\n        this.dom,a=e.focus,c=e.defaults.zIndex++;b.wrap.css(\"zIndex\",c);this._lockMask&&this._lockMask.css(\"zIndex\",c-1);a&&a.dom.outer.removeClass(\"d-state-focus\");e.focus=this;b.outer.addClass(\"d-state-focus\");return this},lock:function(){if(this._isLock)return this;var b=this,a=this.dom,c=document.createElement(\"div\"),f=g(c),i=e.defaults.zIndex-1;this.zIndex();a.outer.addClass(\"d-state-lock\");f.css({zIndex:i,position:\"fixed\",left:0,top:0,width:\"100%\",height:\"100%\",overflow:\"hidden\"}).addClass(\"d-mask\");\n        d||f.css({position:\"absolute\",width:g(h).width()+\"px\",height:g(document).height()+\"px\"});f.bind(\"click\",function(){b._reset()});document.body.appendChild(c);this._lockMask=f;this._isLock=!0;return this},unlock:function(){if(!this._isLock)return this;this._lockMask.unbind();this._lockMask.hide();this._lockMask.remove();this.dom.outer.removeClass(\"d-state-lock\");this._isLock=!1;return this},_getDom:function(){var b=document.body;if(!b)throw Error('artDialog: \"documents.body\" not ready');\n        var a=document.createElement(\"div\");a.style.cssText=\"position:absolute;left:0;top:0\";a.innerHTML=e._templates;b.insertBefore(a,b.firstChild);for(var c=0,d={},f=a.getElementsByTagName(\"*\"),i=f.length;c<i;c++)(b=f[c].className.split(\"d-\")[1])&&(d[b]=g(f[c]));d.window=g(h);d.document=g(document);d.wrap=g(a);return d},_click:function(b){b=this._listeners[b]&&this._listeners[b].callback;return\"function\"!==typeof b||!1!==b.call(this)?this.close():this},_reset:function(){var b=this.config.follow;b?this.follow(b):\n        this.position()},_addEvent:function(){var b=this,a=this.dom;a.wrap.bind(\"click\",function(c){c=c.target;if(c.disabled)return!1;if(c===a.close[0])return b._click(\"cancel\"),!1;(c=c[o+\"callback\"])&&b._click(c)}).bind(\"mousedown\",function(){b.zIndex()})},_removeEvent:function(){this.dom.wrap.unbind()}};e.fn.constructor.prototype=e.fn;g.fn.dialog=g.fn.artDialog=function(){var b=arguments;this[this.live?\"live\":\"bind\"](\"click\",function(){e.apply(this,b);return!1});return this};e.focus=null;e.get=function(b){return b===\n    i?e.list:e.list[b]};e.list={};g(document).bind(\"keydown\",function(b){var a=b.target,c=a.nodeName,d=/^input|textarea$/i,f=e.focus,b=b.keyCode;f&&f.config.esc&&!(d.test(c)&&\"button\"!==a.type)&&27===b&&f._click(\"cancel\")});g(h).bind(\"resize\",function(){var b=e.list,a;for(a in b)b[a]._reset()});e._templates='<div class=\"d-outer\"><table class=\"d-border\"><tbody><tr><td class=\"d-nw\"></td><td class=\"d-n\"></td><td class=\"d-ne\"></td></tr><tr><td class=\"d-w\"></td><td class=\"d-c\"><div class=\"d-inner\"><table class=\"d-dialog\"><tbody><tr><td class=\"d-header\"><div class=\"d-titleBar\"><div class=\"d-title\"></div><a class=\"d-close\" href=\"javascript:/*artDialog*/;\"></a></div></td></tr><tr><td class=\"d-main\"><div class=\"d-content\"></div></td></tr><tr><td class=\"d-footer\"><div class=\"d-buttons\"></div></td></tr></tbody></table></div></td><td class=\"d-e\"></td></tr><tr><td class=\"d-sw\"></td><td class=\"d-s\"></td><td class=\"d-se\"></td></tr></tbody></table></div>';\n    e.defaults={content:'<div class=\"d-loading\"><span>数据加载中...</span></div>',title:\"消息提示：\",button:null,ok:null,cancel:null,initialize:null,beforeunload:null,okValue:\"确定\",cancelValue:\"取消\",width:\"auto\",height:\"auto\",padding:\"20px 25px\",skin:null,time:null,esc:!0,focus:false,visible:!0,follow:null,lock:true,fixed:true,zIndex:1987};this.artDialog=g.dialog=g.artDialog=e})(this.art||this.jQuery,this);\n(function(c){c.alert=c.dialog.alert=function(b,a){return c.dialog({id:\"Alert\",fixed:!0,lock:!0,content:b,ok:!0,beforeunload:a})};c.confirm=c.dialog.confirm=function(b,a,m){return c.dialog({id:\"Confirm\",fixed:!0,lock:!0,content:b,ok:a,cancel:m})};c.prompt=c.dialog.prompt=function(b,a,m){var d;return c.dialog({id:\"Prompt\",fixed:!0,lock:!0,content:['<div style=\"margin-bottom:5px;font-size:12px\">',b,'</div><div><input type=\"text\" class=\"d-input-text\" value=\"',m||\"\",'\"  /></div>'].join(\"\"),\n    initialize:function(){d=this.dom.content.find(\".d-input-text\")[0];d.select();d.focus()},ok:function(){return a&&a.call(this,d.value)},cancel:function(){}})};c.dialog.prototype.shake=function(){var b=function(a,b,c){var h=+new Date,e=setInterval(function(){var f=(+new Date-h)/c;1<=f?(clearInterval(e),b(f)):a(f)},13)},a=function(c,d,g,h){var e=h;void 0===e&&(e=6,g/=e);var f=parseInt(c.style.marginLeft)||0;b(function(a){c.style.marginLeft=f+(d-f)*a+\"px\"},function(){0!==e&&a(c,1===e?0:1.5*(d/e-d),g,--e)},\n    g)};return function(){a(this.dom.wrap[0],10,300);return this}}();var o=function(){var b=this,a=function(a){var c=b[a];b[a]=function(){return c.apply(b,arguments)}};a(\"start\");a(\"over\");a(\"end\")};o.prototype={start:function(b){c(document).bind(\"mousemove\",this.over).bind(\"mouseup\",this.end);this._sClientX=b.clientX;this._sClientY=b.clientY;this.onstart(b.clientX,b.clientY);return!1},over:function(b){this._mClientX=b.clientX;this._mClientY=b.clientY;this.onover(b.clientX-this._sClientX,b.clientY-this._sClientY);\n    return!1},end:function(b){c(document).unbind(\"mousemove\",this.over).unbind(\"mouseup\",this.end);this.onend(b.clientX,b.clientY);return!1}};var j=c(window),k=c(document),i=document.documentElement,p=!!(\"minWidth\"in i.style)&&\"onlosecapture\"in i,q=\"setCapture\"in i,r=function(){return!1},n=function(b){var a=new o,c=artDialog.focus,d=c.dom,g=d.wrap,h=d.title,e=g[0],f=h[0],i=d.main[0],l=e.style,s=i.style,t=b.target===d.se[0]?!0:!1,u=(d=\"fixed\"===e.style.position)?0:k.scrollLeft(),v=d?0:k.scrollTop(),n=\n    j.width()-e.offsetWidth+u,A=j.height()-e.offsetHeight+v,w,x,y,z;a.onstart=function(){t?(w=i.offsetWidth,x=i.offsetHeight):(y=e.offsetLeft,z=e.offsetTop);k.bind(\"dblclick\",a.end).bind(\"dragstart\",r);p?h.bind(\"losecapture\",a.end):j.bind(\"blur\",a.end);q&&f.setCapture();g.addClass(\"d-state-drag\");c.focus()};a.onover=function(a,b){if(t){var c=a+w,d=b+x;l.width=\"auto\";s.width=Math.max(0,c)+\"px\";l.width=e.offsetWidth+\"px\";s.height=Math.max(0,d)+\"px\"}else c=Math.max(u,Math.min(n,a+y)),d=Math.max(v,Math.min(A,\n    b+z)),l.left=c+\"px\",l.top=d+\"px\"};a.onend=function(){k.unbind(\"dblclick\",a.end).unbind(\"dragstart\",r);p?h.unbind(\"losecapture\",a.end):j.unbind(\"blur\",a.end);q&&f.releaseCapture();g.removeClass(\"d-state-drag\")};a.start(b)};c(document).bind(\"mousedown\",function(b){var a=artDialog.focus;if(a){var c=b.target,d=a.config,a=a.dom;if(!1!==d.drag&&c===a.title[0]||!1!==d.resize&&c===a.se[0])return n(b),!1}})})(this.art||this.jQuery);\n_path=window['_artDialog_path']||(function(script,i,me){_thisScript=me||script[script.length-1];me=_thisScript.src.replace(/\\\\/g,'/');return me.lastIndexOf('/')<0?'.':me.substring(0,me.lastIndexOf('/'));}(document.getElementsByTagName('script')));_skin=_thisScript.src.split('skin=')[1];if(_skin){var link=document.createElement('link');link.rel='stylesheet';link.href=_path+'/'+_skin+'.css';_thisScript.parentNode.insertBefore(link,_thisScript);};\n$.fn.extend({mousewheel:function(a){return this.each(function(){var b=this;b.D=0;if($.browser.msie||$.browser.safari){b.onmousewheel=function(){b.D=event.wheelDelta;event.returnValue=false;a&&a.call(b)}}else{b.addEventListener(\"DOMMouseScroll\",function(c){b.D=c.detail>0?-1:1;c.preventDefault();a&&a.call(b)},false)}})}});$.fn.extend({jscroll:function(a){return this.each(function(){a=a||{};a.Bar=a.Bar||{};a.Btn=a.Btn||{};a.Bar.Bg=a.Bar.Bg||{};a.Bar.Bd=a.Bar.Bd||{};a.Btn.uBg=a.Btn.uBg||{};a.Btn.dBg=a.Btn.dBg||{};var d={W:\"5px\",BgUrl:\"\",Bg:\"#fff\",Bar:{Pos:\"up\",Bd:{Out:\"#b5b5b5\",Hover:\"#ccc\"},Bg:{Out:\"#fff\",Hover:\"#fff\",Focus:\"orange\"}},Btn:{btn:true,uBg:{Out:\"#ccc\",Hover:\"#fff\",Focus:\"orange\"},dBg:{Out:\"#ccc\",Hover:\"#fff\",Focus:\"orange\"}},Fn:function(){}};a.W=a.W||d.W;a.BgUrl=a.BgUrl||d.BgUrl;a.Bg=a.Bg||d.Bg;a.Bar.Pos=a.Bar.Pos||d.Bar.Pos;a.Bar.Bd.Out=a.Bar.Bd.Out||d.Bar.Bd.Out;a.Bar.Bd.Hover=a.Bar.Bd.Hover||d.Bar.Bd.Hover;a.Bar.Bg.Out=a.Bar.Bg.Out||d.Bar.Bg.Out;a.Bar.Bg.Hover=a.Bar.Bg.Hover||d.Bar.Bg.Hover;a.Bar.Bg.Focus=a.Bar.Bg.Focus||d.Bar.Bg.Focus;a.Btn.btn=a.Btn.btn!=undefined?a.Btn.btn:d.Btn.btn;a.Btn.uBg.Out=a.Btn.uBg.Out||d.Btn.uBg.Out;a.Btn.uBg.Hover=a.Btn.uBg.Hover||d.Btn.uBg.Hover;a.Btn.uBg.Focus=a.Btn.uBg.Focus||d.Btn.uBg.Focus;a.Btn.dBg.Out=a.Btn.dBg.Out||d.Btn.dBg.Out;a.Btn.dBg.Hover=a.Btn.dBg.Hover||d.Btn.dBg.Hover;a.Btn.dBg.Focus=a.Btn.dBg.Focus||d.Btn.dBg.Focus;a.Fn=a.Fn||d.Fn;var e=this;var m,u=0,w=0;$(e).css({overflow:\"hidden\",position:\"relative\",padding:\"0px\"});var l=$(e).width(),s=$(e).height()-1;var o=a.W?parseInt(a.W):21;var t=l-o;var r=a.Btn.btn==true?o:0;if($(e).children(\".jscroll-c\").height()==null){$(e).wrapInner(\"<div class='jscroll-c' style='top:0px;z-index:9999;zoom:1;position:relative'></div>\");$(e).children(\".jscroll-c\").prepend(\"<div style='height:0px;overflow:hidden'></div>\");$(e).append(\"<div class='jscroll-e' unselectable='on' style=' height:100%;top:0px;right:0;-moz-user-select:none;position:absolute;overflow:hidden;z-index:10000;'><div class='jscroll-u' style='position:absolute;top:0px;width:100%;left:0;background:blue;overflow:hidden'></div><div class='jscroll-h'  unselectable='on' style='background:green;position:absolute;left:0;-moz-user-select:none;border:1px solid'></div><div class='jscroll-d' style='position:absolute;bottom:0px;width:100%;left:0;background:blue;overflow:hidden'></div></div>\")}var j=$(e).children(\".jscroll-c\");var h=$(e).children(\".jscroll-e\");var g=h.children(\".jscroll-h\");var b=h.children(\".jscroll-u\");var i=h.children(\".jscroll-d\");if($.browser.msie){document.execCommand(\"BackgroundImageCache\",false,true)}j.css({\"padding-right\":o});h.css({width:o,background:a.Bg,\"background-image\":a.BgUrl});g.css({top:r,background:a.Bar.Bg.Out,\"background-image\":a.BgUrl,\"border-color\":a.Bar.Bd.Out,width:o-2});b.css({height:r,background:a.Btn.uBg.Out,\"background-image\":a.BgUrl});i.css({height:r,background:a.Btn.dBg.Out,\"background-image\":a.BgUrl});g.hover(function(){if(w==0){$(this).css({background:a.Bar.Bg.Hover,\"background-image\":a.BgUrl,\"border-color\":a.Bar.Bd.Hover})}},function(){if(w==0){$(this).css({background:a.Bar.Bg.Out,\"background-image\":a.BgUrl,\"border-color\":a.Bar.Bd.Out})}});b.hover(function(){if(w==0){$(this).css({background:a.Btn.uBg.Hover,\"background-image\":a.BgUrl})}},function(){if(w==0){$(this).css({background:a.Btn.uBg.Out,\"background-image\":a.BgUrl})}});i.hover(function(){if(w==0){$(this).css({background:a.Btn.dBg.Hover,\"background-image\":a.BgUrl})}},function(){if(w==0){$(this).css({background:a.Btn.dBg.Out,\"background-image\":a.BgUrl})}});var c=j.height();var v=(s-2*r)*s/c;if(v<10){v=10}var f=v/6;var k=0,q=false;g.height(v);if(c<=s){j.css({padding:0});h.css({display:\"none\"})}else{q=true}if(a.Bar.Pos!=\"up\"){k=s-v-r;p()}g.bind(\"mousedown\",function(z){a.Fn&&a.Fn.call(e);w=1;g.css({background:a.Bar.Bg.Focus,\"background-image\":a.BgUrl});var y=z.pageY,x=parseInt($(this).css(\"top\"));$(document).mousemove(function(A){k=x+A.pageY-y;p()});$(document).mouseup(function(){w=0;g.css({background:a.Bar.Bg.Out,\"background-image\":a.BgUrl,\"border-color\":a.Bar.Bd.Out});$(document).unbind()});return false});b.bind(\"mousedown\",function(x){a.Fn&&a.Fn.call(e);w=1;b.css({background:a.Btn.uBg.Focus,\"background-image\":a.BgUrl});e.timeSetT(\"u\");$(document).mouseup(function(){w=0;b.css({background:a.Btn.uBg.Out,\"background-image\":a.BgUrl});$(document).unbind();clearTimeout(m);u=0});return false});i.bind(\"mousedown\",function(x){a.Fn&&a.Fn.call(e);w=1;i.css({background:a.Btn.dBg.Focus,\"background-image\":a.BgUrl});e.timeSetT(\"d\");$(document).mouseup(function(){w=0;i.css({background:a.Btn.dBg.Out,\"background-image\":a.BgUrl});$(document).unbind();clearTimeout(m);u=0});return false});e.timeSetT=function(z){var x=this;if(z==\"u\"){k-=f}else{k+=f}p();u+=2;var y=500-u*50;if(y<=0){y=0}m=setTimeout(function(){x.timeSetT(z)},y)};h.bind(\"mousedown\",function(x){a.Fn&&a.Fn.call(e);k=k+x.pageY-g.offset().top-v/2;n();return false});function n(){if(k<r){k=r}if(k>s-v-r){k=s-v-r}g.stop().animate({top:k},100);var x=-((k-r)*c/(s-2*r));j.stop().animate({top:x},1000)}function p(){if(k<r){k=r}if(k>s-v-r){k=s-v-r}g.css({top:k});var x=-((k-r)*c/(s-2*r));j.css({top:x})}$(e).mousewheel(function(){if(q!=true){return}a.Fn&&a.Fn.call(e);if(this.D>0){k-=f}else{k+=f}p()})})}});\n\n"
  },
  {
    "path": "js/jQuery.im.js",
    "content": "﻿;(function($){\r\n    $.fn.extend({\r\n        //将可选择的变量传递给方法\r\n        FnWebIM: function(options) {\r\n            //设置默认值并用逗号隔开\r\n            var defaults = {\r\n                autoLogin          :true,      //boolean型，默认是否自动登录，true：自动登录，false：手动登录，默认为true\r\n                msgRefreshTime    :1000,       //number型，消息刷新时间，单位为ms\r\n                friendRefreshTime :10000,     //number型，好友刷新时间，单位为ms\r\n                showSecretary     :true,      //boolean型，默认是否显示小秘书，true：显示，false：不显示，默认为true\r\n                noticeContent     :\"\",        //string型，公告内容 为空时不显示公告\r\n                sendPicture       :true,      //boolean型，是否允许发送图片，true：允许，false：不允许，默认为true\r\n                msgMaxSize        :300,        //number型，单条消息最大允许字符\r\n                msgSound           :true,      //是否开启声音提醒\r\n                defaultWindow     :\"\"         //string型，登录后打开新聊天窗口，从用户点击的链接接收参数\r\n            }\r\n            var options =  $.extend(defaults, options);\r\n            return this.each(function() {\r\n                //显示fn_imbar\r\n                $(\"body\").append('<div id=\"fn_imbar\" class=\"im_login\"><span>在线交流工具<b title=\"3条未读消息\">3</b></span></div><div id=\"fn_imbox\"></div>');\r\n\r\n                $(\"#fn_imbar.im_login\").click(function(){\r\n                    $(this).attr(\"class\",\"im_loading\").find(\"span\").html(\"登录中，请稍后…\");\r\n                    /************************联系人面板****************************/\r\n                    $.ajax({url:\"ajax/im_contact.html\",dataType:\"html\",success:loginIM,error:loginError});\r\n                    function loginIM(data){\r\n                        //显示联系人面板\r\n                        $(\"#fn_imbox\").html(data).show();\r\n                        //装配联系人数据\r\n                        Friends();\r\n                        $(\"#fn_imbar\").hide();\r\n                        $(\"#fn_imbox .im_top h4\").toggle(function(){//收起联系人面板\r\n                            $(\"#fn_imbox\").animate({height: 30}, 800);\r\n                            $(\"#fn_imbox .im_bottombar ul\").hide();\r\n                        },function(){//展开联系人面板\r\n                            $(\"#fn_imbox\").animate({height: 360}, 800);\r\n                        });\r\n\r\n                        //修改资料\r\n                        $(\"#fn_imbox .im_top a.modify\").click(function(){\r\n                            $.ajax({url:\"ajax/msgbox.html\",dataType:\"html\",success:function(data){\r\n                                art.dialog({title:\"消息盒子\",padding:0,content:data,ok:function(){}});\r\n                                $(\"#im_msgboxs\").jscroll();\r\n                                $(\"dl.im_msgbox dd.im_msginfo\").click(function(){\r\n                                    var uid=$(this).attr(\"uid\");\r\n                                    $.ajax({url:\"ajax/im_window.html\",dataType:\"html\",success:function(data){\r\n                                        var uid=$(this).attr(\"uid\");\r\n                                        $.getJSON(\"ajax/userinfo.php?uid=\"+uid,function(json){\r\n                                            //打开新窗口\r\n                                            openWindow(json[0].cid,json[0].UID,json[0].isOnline,json[0].UserAvatar,json[0].cname,json[0].UserName,data);\r\n                                        });\r\n                                    },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                        message(\"对不起，聊天窗口加载失败！ CODE:\"+XMLHttpRequest.status);\r\n                                    }});\r\n                                });\r\n                                $(\"dl.im_msgbox dt, dl.im_msgbox .msg_contact\").click(function(){\r\n                                    card($(this).attr(\"uid\"));\r\n                                });\r\n                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"消息窗口加载失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                            }});\r\n                        });\r\n\r\n\r\n                        //好友分组\r\n                        $(\"#fn_imbox .im_contents h4\").click(function(){\r\n                            $(this).attr(\"class\",\"im_group_expansion\").siblings(\"h4\").attr(\"class\",\"im_group_away\").siblings(\".im_group_contacts\").hide();\r\n                            $(this).next(\".im_group_contacts\").show().jscroll();//显示滚动条\r\n                        });\r\n                        //好友搜索\r\n                        $(\"#fn_imbox .im_bottombar input\").focus(function(){\r\n                            if($(this).val()==\"查找联系人\"){\r\n                                $(this).val(\"\");\r\n                            }\r\n                            //$(this).die().live('keyup',function(){\r\n                            //    var contactNum=$(this).parents(\"#fn_imbox\").find(\".im_contact span\").size(),\r\n                            //         searchTxt=$(this).val();\r\n                            //    if(contactNum!=0 && $.trim(searchTxt).length!=0){\r\n                            //        for(var i=0;i<contactNum;i++){\r\n                            //            var contactName=$(this).parents(\"#fn_imbox\").find(\".im_contact span\").eq(i).text();\r\n                            //            if(contactName.indexOf(searchTxt)!=-1){\r\n                            //               $(this).parents(\"#fn_imbox\").find(\".im_contact span\").eq(i).parents(\".im_contact\").hide();\r\n                            //           }\r\n                            //        }\r\n                            //    }\r\n                            //});\r\n                        }).blur(function(){\r\n                                if($(this).val()==\"\"){\r\n                                    $(this).val(\"查找联系人\");\r\n                                }\r\n                            });\r\n                        //设置选项\r\n                        $(\"#fn_imbox .im_bottombar span\").toggle(function(){\r\n                            $(this).addClass(\"current\").parent().find(\"ul\").fadeIn();\r\n                        },function(){\r\n                            $(this).removeClass(\"current\").parent().find(\"ul\").hide();\r\n                        });\r\n//                            $(\"#fn_imbox .im_bottombar li.selected:not('.smssub')\").click(function(){\r\n//                                if($(this).hasClass(\"current\")){\r\n//                                    $(this).removeClass(\"current\");\r\n//                                }\r\n//                                else{\r\n//                                    $(this).addClass(\"current\");\r\n//                                }\r\n//                                //提交用户设置数据\r\n//                            });\r\n//                        $(\"#fn_imbox .im_bottombar li.smssub\").click(function(){\r\n//                            art.alert(\"您还没有开通短信小秘书功能，请先开通。 <a href='#' target='_blank'>开通&gt;</a> \");\r\n//                        });\r\n                        $(\"#fn_imbox .im_bottombar li.setting\").click(function(){\r\n                            modify();\r\n                        });\r\n                        $(\"#fn_imbox .im_bottombar li.backlist\").click(function(){\r\n                            $.ajax({url:\"ajax/friends.html\",dataType:\"html\",success:function(data){\r\n                                art.dialog({title:\"查看黑名单\",padding:0,content:data,ok:function(){\r\n\r\n                                }});\r\n                                $(\".im_friendsbox\").jscroll();\r\n                                $(\".im_friendsbox dt, .im_friendname\").click(function(){\r\n                                    card($(this).attr(\"uid\"));\r\n                                });\r\n                                $(\"a.im_addcontact\").click(function(){\r\n                                    $(this).parents(\"dl\").fadeOut();\r\n                                    message(\"好友添加成功！\");\r\n                                });\r\n                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"黑名单面板加载失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                            }});\r\n                        });\r\n                        $(\"#fn_imbox .im_bottombar li.friends\").click(function(){\r\n                            $.ajax({url:\"ajax/friends.html\",dataType:\"html\",success:function(data){\r\n                                art.dialog({title:\"推荐好友\",padding:0,content:data,ok:function(){\r\n\r\n                                }});\r\n                                $(\".im_friendsbox\").jscroll();\r\n                                $(\".im_friendsbox dt, .im_friendname\").click(function(){\r\n                                    card($(this).attr(\"uid\"));\r\n                                });\r\n                                $(\"a.im_addcontact\").click(function(){\r\n                                    Friends();\r\n                                    $(this).parents(\"dl\").fadeOut();\r\n                                    message(\"好友添加成功！\");\r\n                                });\r\n                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"推荐好友面板加载失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                            }});\r\n                        });\r\n                        $(\"#fn_imbox .im_bottombar li.loginout\").click(function(){\r\n                            art.confirm(\"您确定要退出本次登录吗？\",function(){\r\n                                loginTimeOut();\r\n                                message(\"注销成功！\");\r\n\r\n                            },function(){\r\n\r\n                            });\r\n                        });\r\n                        //会话超时\r\n                        function loginTimeOut(){\r\n                            $.ajax({url:\"ajax/login.html\",dataType:\"html\",success:function(data){\r\n                                art.dialog({title:\"会话超时，请重新登录！\",content:data,okValue:\"登录\",ok:function(){\r\n                                    message(\"登录成功！\");\r\n                                },cancel:function(){\r\n                                    message(\"登录已取消！\");\r\n                                }});\r\n                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"登录面板获取失败！CODE:\"+XMLHttpRequest.status);\r\n                            }});\r\n                        }\r\n                        //加载聊天窗口\r\n                        $.ajax({url:\"ajax/im_window.html\",dataType:\"html\",success:function(data){\r\n                            if(options.defaultWindow!=\"\"){\r\n                                $.getJSON(\"ajax/userinfo.php?uid=\"+options.defaultWindow,function(json){\r\n                                    //打开新窗口\r\n                                    openWindow(json[0].cid,json[0].UID,json[0].isOnline,json[0].UserAvatar,json[0].cname,json[0].UserName,data);\r\n                                });\r\n                            }\r\n                            $(\".im_contact\").click(function(){\r\n                                //选中联系人\r\n                                $(\".im_contact\").removeClass(\"current\");\r\n                                $(this).addClass(\"current\");\r\n                                //清除消息提示\r\n                                $(this).find(\"b\").remove();\r\n                                //阻止全选\r\n                                this.onselectstart=function(){return false};\r\n                                var uid=$(this).attr(\"uid\");\r\n                                $.getJSON(\"ajax/userinfo.php?uid=\"+uid,function(json){\r\n                                    //打开新窗口\r\n                                    openWindow(json[0].cid,json[0].UID,json[0].isOnline,json[0].UserAvatar,json[0].cname,json[0].UserName,data);\r\n                                });\r\n                                //清除消息提示\r\n                                if($(\".im_contents\").has(\"b\").length==0){\r\n                                    noMsg();\r\n                                }\r\n                            });\r\n                        },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                            message(\"对不起，聊天窗口加载失败！ CODE:\"+XMLHttpRequest.status);\r\n                        }});\r\n                    }\r\n                    function loginError(XMLHttpRequest, textStatus, errorThrown){\r\n                        art.alert(\"登录超时，请重新登录！ CODE:\"+XMLHttpRequest.status,function(){loginTimeOut();});\r\n                    }\r\n                    /****装配联系人数据****/\r\n                    function Friends(){\r\n                        $(\"#imRencentContacts,#imFriends\").html(\"\");\r\n                        //凡纳小秘书\r\n                        if(options.showSecretary){\r\n                            $(\"#imFriends\").append('<div class=\"im_contact online\"  uid=\"\"><i><img src=\"../img/avatar_s-sys.png\" width=\"30\" height=\"30\" /><sup></sup></i><span>凡纳小秘书</span><a href=\"#\" target=\"_blank\"></a></div>');\r\n                        }\r\n                        $.getJSON(\"ajax/friends.php\",function(json){\r\n                            for(var i=0;i<json[0].RencentContacts.length;i++){\r\n                                $(\"#imRencentContacts\").append('<div class=\"im_contact '+json[0].RencentContacts[i].o+'\" uid=\"'+json[0].RencentContacts[i].uid+'\"><i><img src=\"'+json[0].RencentContacts[i].a+'\" width=\"30\" height=\"30\" /><sup></sup></i><span>'+json[0].RencentContacts[i].n+'</span><a href=\"'+json[0].RencentContacts[i].h+'\" target=\"_blank\"></a></div>');\r\n                                if(json[0].RencentContacts[i].m!=0){\r\n                                    $(\"#imRencentContacts .im_contact:eq(\"+i+\")\").find(\"span\").append(\"<b></b>\");\r\n                                }\r\n                            }\r\n\r\n                            for(var i=0;i<json[0].Friends.length;i++){\r\n                                $(\"#imFriends\").append('<div class=\"im_contact '+json[0].Friends[i].o+'\" uid=\"'+json[0].Friends[i].uid+'\"><i><img src=\"'+json[0].Friends[i].a+'\" width=\"30\" height=\"30\" /><sup></sup></i><span>'+json[0].Friends[i].n+'</span><a href=\"'+json[0].Friends[i].h+'\" target=\"_blank\"></a></div>');\r\n                                if(json[0].RencentContacts[i].m!=0){\r\n                                    $(\"#imFriends .im_contact:eq(\"+i+\")\").find(\"span\").append(\"<b></b>\");\r\n                                }\r\n                            }\r\n                            var Scroll=function(){$(\".im_contacts\").jscroll();}//显示滚动条\r\n                            Scroll();\r\n                            $(\"#imRencentContacts\").prev(\"h4\").find(\"i\").html(\"(\"+json[0].RencentContactsOnline+\"/\"+json[0].RencentContacts.length+\")\");\r\n                            $(\"#imFriends\").prev(\"h4\").find(\"i\").html(\"(\"+json[0].FriendsOnline+\"/\"+json[0].Friends.length+\")\");\r\n                            if(json[0].RencentContactsOnline!=0&&json[0].FriendsOnline!=0){\r\n                               newMsg();//新消息提醒\r\n                            }\r\n                        });\r\n\r\n                    }\r\n                    /****打开新聊天窗口****/\r\n                    function openWindow(cid,uid,o,a,n,c,m){\r\n                        var t='<div class=\"im_contactinfobar\"><a class=\"im_avatar\" '+o+' href=\"javascript:;\" uid=\"'+uid+'\"><img src=\"'+a+'\"  width=\"50\" height=\"50\" /></a><span class=\"im_contactinfo\"><a class=\"im_contactcompany\" href=\"javascript:;\" cid=\"'+cid+'\">'+n+'</a> - <a class=\"im_contact\"  id=\"contactcard\" href=\"javascript:;\" uid=\"'+uid+'\">'+c+'</a><a class=\"im_addcontact\" id=\"imcontact\"  href=\"javascript:;\" title=\"添加好友\">&nbsp;</a></span></div>';\r\n                        //关闭上一个聊天窗口\r\n                        art.dialog({id:\"msgWindow\"}).close();\r\n                        //创建新聊天窗口\r\n                        art.dialog({id:\"msgWindow\",padding:\"0\",lock:false,title:t,content:m});\r\n                        //显示公告内容\r\n                        if(options.noticeContent!=\"\"){\r\n                            $(\".im_chats .im_morechats\").before('<div class=\"im_notice\"><span>'+options.noticeContent+'</span><a href=\"javascript:;\" class=\"im_notice_close\"></a></div>');\r\n                        }\r\n                        //操作当前聊天窗口\r\n                        operatewindow();\r\n                        //加载聊天记录\r\n                        msgList();\r\n                    }\r\n                    /****加载聊天记录****/\r\n                    function msgList(){\r\n                        $.getJSON(\"ajax/chats.php\",function(json){\r\n                            $.each(json,function(i){\r\n                                if(json[i].T==\"0\"){\r\n                                    $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content\"><i>'+json[i].D+'</i><div class=\"im_chat_txt\">'+json[i].M+'</div></div>');\r\n                                }\r\n                                else if(json[i].T==\"1\"){\r\n                                    $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content myself\"><i>'+json[i].D+'</i><div class=\"im_chat_txt\">'+json[i].M+'</div></div>');\r\n                                }\r\n\r\n                            });\r\n                            //滚动条显示\r\n                            $(\".im_chats\").jscroll();\r\n                            //滚动条显示->聊天记录中有图片的情况\r\n                            var imgSize=$(\".im_chats img\").size();\r\n                            $(\".im_chats img\").load(function(){\r\n                                if(!--imgSize){\r\n                                    $(\".im_chats\").jscroll();\r\n                                }\r\n                            })\r\n                        });\r\n                    }\r\n                    /****聊天窗口选项****/\r\n                    function operatewindow(){\r\n                        //表情面板\r\n                        $(\".im_face\").click(function(){\r\n                            var _this=$(this).parent().find(\"#im_face\");\r\n                            _this.show();\r\n                            $.ajax({url:\"ajax/im_face.html\",success:function(data){\r\n                                _this.html(data).find(\".im_faceclose,.im_faceico a\").click(function(){\r\n                                    $(\"#im_face\").hide();\r\n                                });\r\n                                _this.find(\".im_faceico a\").click(function(){\r\n                                    //取到表情代码  $(this).attr(\"code\")\r\n                                    $(\"#im_window .im_send_msg\").html($(\"#im_window .im_send_msg\").html()+$(this).html()).click();\r\n                                });\r\n                            },dataType:\"html\",error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"表情面板获取失败，请重试！CODE:\"+XMLHttpRequest.status)\r\n                            }});\r\n                        });\r\n                        //发送图片\r\n                        if(options.sendPicture=false){\r\n                            $(\".im_upload_pic\").remove();\r\n                        }\r\n                        $(\".im_upload_pic\").click(function(){\r\n                            art.alert(\"需要用jQuery Ajax上传插件。\");\r\n                        });\r\n                        //发送抖动\r\n                        var lastshakeTime;\r\n                        $(\".im_shake\").click(function(){\r\n                            var shakeTime=new Date().getTime();\r\n                            if(typeof lastshakeTime==\"undefined\"){\r\n                                sendShake();\r\n                                lastshakeTime=shakeTime;\r\n                            }\r\n                            else{\r\n                                if((shakeTime-lastshakeTime)>=10000){\r\n                                    sendShake();\r\n                                }\r\n                                else{\r\n                                    message(\"喝杯茶休息下吧，您的操作太频繁了！\");\r\n                                }\r\n                                lastshakeTime=shakeTime;\r\n                            }\r\n\r\n                        });\r\n                        //发送产品\r\n                        $(\".im_product\").click(function(){\r\n                            art.prompt('请输入您的在凡纳网的产品网址 (<a href=\"javascript:;\" title=\"① 打开您想要发送的的产品页面，\\n② 复制地址栏里的地址粘贴到下面文本框即可。\\n注意：必须为凡纳网的产品地址\">?</a>)：', function (value) {\r\n                                var fnURL=new RegExp(/^http:\\/\\/[A-Za-z0-9|_|-]*.?fanna.com.cn\\/(productdetails|p)_[0-9]*[.htmls]/);\r\n                                if(fnURL.test(value)==true){\r\n                                    var pid=value.substring((value.lastIndexOf('_')+1),value.lastIndexOf(\".\"));\r\n                                    /*************************加载产品信息************************/\r\n                                    $.ajax({url:\"ajax/product.html?pid=\"+pid,dataType:\"html\",success:function(data){\r\n                                        $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content myself\"><i>'+msgTime+'</i><div class=\"im_chat_txt\" style=\"min-height:90px\"><em>您发送了一件产品给对方……</em>'+data+'</div></div>');\r\n                                        $(\".im_chats\").jscroll({Bar:{Pos:\"bottom\"}});\r\n                                        //此处提价用户消息至服务器 msgTime+data\r\n\r\n                                        $(\"a.im_product_favorites\").click(function(){\r\n                                            message(\"收藏成功！\");\r\n                                            $(this).remove();\r\n                                        });\r\n                                        $(\"a.im_product_share\").click(function(){\r\n                                            $.ajax({url:\"ajax/share.html\",dataType:\"html\",success:function(data){\r\n                                                art.dialog({title:\"分享到：\",content:data,ok:function(){}});\r\n                                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                                message(\"分享内容面板加载失败，请重试！CODE\"+XMLHttpRequest.status);\r\n                                            }});\r\n                                        });\r\n                                    },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                        message(\"产品信息获取失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                                    }});\r\n                                }\r\n                                else{\r\n                                    this.shake().title(\"您输入的网址有误，请重新输入！\");\r\n                                    return false;\r\n                                }\r\n                            }, '如：http://www.fanna.com.cn/productdetails_00000000.htmls');\r\n                        });\r\n                        //发送名片\r\n                        $(\".im_card\").click(function(){\r\n                            $.ajax({url:\"ajax/card.html\",success:function(data){\r\n                                art.dialog({content:data,title:\"名片预览\",okValue:\"发送名片\",ok:function(){\r\n                                    $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content myself\"><i>'+msgTime+'</i><div class=\"im_chat_txt\" style=\"min-height:90px\"><em>您发送了自己的名片给对方……</em><div class=\"im_mycard\">'+data+'<p><a href=\"javascript:;\" class=\"cc atocard\">收藏到名片夹</a><a href=\"javascript:;\" class=\"cc aqrcode\">添加到手机通讯录</a></p></div></div></div>');\r\n                                    $(\".im_chats\").jscroll({Bar:{Pos:\"bottom\"}});\r\n                                    //提交数据\r\n                                    message(\"名片发送成功！\");\r\n                                    $(\"a.atocard\").click(function(){\r\n                                        message(\"收藏成功！\");\r\n                                        $(this).remove();\r\n                                    });\r\n                                    $(\"a.aqrcode\").click(function(){\r\n                                        cardQRcode($(\".im_contactcard\"));\r\n                                    });\r\n                                },button:[{value:\"修改名片\",callback:function(){\r\n                                    modify();\r\n                                    return false;\r\n                                }}]});\r\n                            },dataType:\"html\",error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"名片信息获取失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                            }});\r\n\r\n                        });\r\n                        //更多设置\r\n                        $(\"a.im_moreoperates\").click(function(){\r\n                            $(\".im_moreoperate\").animate({height:\"28px\",marginTop:\"-28px\"},400);\r\n                            $(\"a.im_abacklist\").click(function(){\r\n                                art.confirm(\"您确定要将该好友加入黑名单吗？\",function(){\r\n                                    message(\"您已经将该好友加入了黑名单！\");\r\n                                },function(){})\r\n                            });\r\n                            $(\"a.im_areport\").click(function(){\r\n                                art.confirm(\"您确定要举报该好友吗？\",function(){\r\n                                    art.dialog({title:\"请填写举报原因：\",padding:\"0\",content:\"<iframe width='400' scrolling='no' height='215' src='ajax/report.html' frameborder='0'></iframe> \",ok:function(){\r\n                                        //提交数据\r\n                                        message(\"举报成功，我们会尽快核实\");\r\n                                    },cancel:function(){\r\n\r\n                                    }});\r\n                                },function(){})\r\n                            });\r\n                            $(\"a.im_aemptyrecords\").click(function(){\r\n                                art.confirm(\"您确定清空与该好友的聊天记录吗？\",function(){\r\n                                    //清空聊天记录\r\n                                    $.post('ajax/chats.php', function(data) {\r\n                                        //重新加载聊天内容\r\n                                        $(\".im_chats .im_chat_content:gt(0)\").remove();\r\n                                        msgList();\r\n                                    });\r\n                                },function(){})\r\n                            });\r\n                        });\r\n                        $(\".im_moreoperate .im_aclose,.im_send_msg\").click(function(){\r\n                            $(\".im_moreoperate\").animate({height:0,marginTop:\"0\"},200);\r\n                        });\r\n                        //发送留言\r\n                        $(\"#im_window .im_send_msg\").die().live(\"focus\",function(){\r\n                            $(document).die().live(\"keypress\",function(e){\r\n                                if(e.ctrlKey && e.which == 13 || e.which == 10) {\r\n                                    sendMsg();\r\n                                }\r\n                            });\r\n                        });\r\n                        $(\"#im_window .im_sendmsg_btn\").click(function(){\r\n                            sendMsg();\r\n                        });\r\n\r\n                        //公司信息面板\r\n                        $(\".im_contactcompany\").click(function(){\r\n                            $.ajax({url:\"ajax/companyinfo.html?\"+$(this).attr(\"cid\"),dataType:\"html\",success:function(data){\r\n                                $(\".im_contactinfos\").html(data).jscroll();\r\n                                $(\".im_companyFav\").click(function(){\r\n                                    message(\"收藏成功！\");\r\n                                    $(this).parent().html(\"已收藏\");\r\n                                });\r\n                            },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                                message(\"公司信息获取失败，请重试！CODE\"+XMLHttpRequest.status);\r\n                            }});\r\n                            $(\"#im_contactinfo\").show();\r\n                            $(\"#im_contactinfo .d-close\").click(function(){\r\n                                $(\"#im_contactinfo\").hide();\r\n                            });\r\n                        });\r\n                        //联系人名片\r\n                        $(\"#contactcard,.im_avatar\").click(function(){\r\n                            card($(this).attr(\"uid\"));\r\n                        });\r\n                        //关闭主窗体\r\n                        $(\"#im_body .im_close,#im_body .im_minimize\").click(function(){\r\n                            $(\"#im_window\").hide();\r\n                        });\r\n                        //关闭公告\r\n                        $(\"a.im_notice_close\").click(function(){\r\n                            $(this).parent().hide();\r\n                            $(\".im_chats\").jscroll();\r\n                        });\r\n                        //查看聊天记录\r\n                        $(\".im_morechats\").click(function(){\r\n                            //加载聊天记录\r\n                            msgList();\r\n                            $(\".im_chats\").jscroll();\r\n                        });\r\n                        //添加好友\r\n                        $(\"#imcontact\").click(function(){\r\n                            if($(this).hasClass(\"im_addcontact\")){\r\n                                art.confirm('您确定要将对方添加为好友吗？', function () {\r\n                                    //提交数据并刷新联系人列表\r\n                                    Friends();\r\n                                    $(\"#imcontact\").attr({\"class\":\"im_removecontact\",\"title\":\"删除好友\"});\r\n                                    message(\"添加好友成功！\");\r\n                                },function(){});\r\n                            }\r\n                            else{\r\n                                art.confirm('您确定要将对方从好友列表中删除吗？', function () {\r\n                                    //提交数据并刷新联系人列表\r\n                                    Friends();\r\n                                    $(\"#imcontact\").attr({\"class\":\"im_addcontact\",\"title\":\"加为好友\"});\r\n                                    message(\"删除好友成功！\");\r\n                                },function(){});\r\n                            }\r\n\r\n                        });\r\n                    }\r\n                    /****发送窗口抖动****/\r\n                    function sendShake(){\r\n                        art.dialog.get(\"msgWindow\").shake();\r\n                        $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content myself\"><i>'+msgTime+'</i><div class=\"im_chat_txt\"><em>您发送了一个抖动窗口…</em></div></div>');\r\n                        $(\".im_chats\").jscroll({Bar:{Pos:\"bottom\"}});\r\n                    }\r\n                    /****发送消息****/\r\n                    function sendMsg(){\r\n                        //消息发送\r\n                        var msgContent=$(\"#im_window .im_send_msg\");\r\n                        if(msgContent.html().length!=0&&msgContent.html().length<options.msgMaxSize){\r\n                            $(\".im_chats .im_chat_content:last\").after('<div class=\"im_chat_content myself\"><i>'+msgTime+'</i><div class=\"im_chat_txt\">'+msgContent.html()+'</div></div>');\r\n                            $(\".im_chats\").jscroll({Bar:{Pos:\"bottom\"}});\r\n                            urlFilter();\r\n                            msgContent.html(\"\").click();\r\n                            //此处提价用户消息至服务器\r\n                        }\r\n                        else if(msgContent.html().length==0){\r\n                            message(\"对不起，消息不能为空！\");\r\n                            msgContent.click();\r\n                        }\r\n                        else{\r\n                            message(\"对不起，您输入的字数超过限制！\");\r\n                        }\r\n                    }\r\n                    /****网址过滤****/\r\n                    function urlFilter(){\r\n                        var msgRecord = $(\".im_chats .im_chat_content:last\"),urls;\r\n                        try{\r\n                            urls=msgRecord.html().match(/http:\\/\\/[A-Za-z0-9|_|-]*.?fanna.com.cn\\/[0-9a-z_!~*'().;?:@&=+$,%#-]*/gi);\r\n                            for(var i=0;i<urls.length;i++){\r\n                                msgRecord.html(msgRecord.html().replace(urls[i], '<a class=\"fn_url\" href=\"'+urls[i]+'\" target=\"_blank\" title=\"凡纳网官方网站，没有安全风险\">'+urls[i]+'</a>'));\r\n                            }\r\n                        }catch(ex){}\r\n                    }\r\n                    /****消息发送时间，可能需要改为服务器时间****/\r\n                    var msgTime=msgDate();\r\n                    function msgDate(){\r\n                        //系统时间，需改为服务器时间\r\n                        var msgDate= new Date();\r\n                        return (parseInt(msgDate.getMonth())+1)+\"-\"+msgDate.getDate()+\" \"+msgDate.getHours()+\":\"+msgDate.getMinutes()+\":\"+msgDate.getSeconds();\r\n                    }\r\n                    /****新消息提示****/\r\n                    function newMsg(){\r\n                        $(\"#fn_imbox .im_top h4\").addClass(\"im_newmsg\");\r\n                        if(options.msgSound){\r\n                            $(\"body\").append('<object type=\"application/x-shockwave-flash\" data=\"sound/msg.swf\" width=\"10\" height=\"10\" id=\"newMessage\" style=\"overflow: hidden;\"><param name=\"movie\" value=\"sound/msg.swf\" /></object>');\r\n                            setTimeout(function(){$(\"#newMessage\").remove()},3000);\r\n                        }\r\n                    }\r\n                    /****清除新消息提示****/\r\n                    function noMsg(){\r\n                        $(\"#fn_imbox .im_top h4\").removeClass(\"im_newmsg\");\r\n                    }\r\n                    /****修改资料****/\r\n                    function modify(){\r\n                        $.ajax({url:\"ajax/set.html\",dataType:\"html\",success:function(data){\r\n                            art.dialog({title:\"修改我的资料：\",content:data,okValue:\"提交修改\",cancelValue:\"取消\",\r\n                                ok:function(){\r\n                                    message(\"资料修改成功！\");\r\n                                },cancel:function(){\r\n\r\n                                }});\r\n                        },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                            message(\"设置面板加载失败！CODE:\"+XMLHttpRequest.status);\r\n                        }});\r\n\r\n                    }\r\n                    /****用户名片****/\r\n                    function card(uid){\r\n                        $.ajax({url:\"ajax/card.html?uid=\"+uid,dataType:\"html\",success:function(data){\r\n                            art.dialog({content:data,title:false,okValue:\"收藏该名片\",ok:function(){\r\n                                message(\"收藏成功！您可以从“我的名片夹”查看该名片。</a>\");\r\n                            },button:[{value:\"添加到手机通讯录\",callback:function(){\r\n                                cardQRcode($(\".im_contactcard\"));\r\n                                return false;\r\n                            }}]});\r\n                        },error:function(XMLHttpRequest, textStatus, errorThrown){\r\n                            message(\"名片信息获取失败，请重试！CODE:\"+XMLHttpRequest.status);\r\n                        }});\r\n                    }\r\n                    /****名片二维码****/\r\n                    function cardQRcode(pNode){\r\n                        var QRcode={\r\n                            Name:pNode.find(\"dt b\").text(),\r\n                            Title:pNode.find(\"dt i\").text(),\r\n                            Department:pNode.find(\"dt span\").text(),\r\n                            Company:$(\"\").text(),//公司名称\r\n                            Zipcode:pNode.find(\".zipcode i\").text(),\r\n                            Phone:pNode.find(\".phone i\").text(),\r\n                            Fax:pNode.find(\".fax i\").text(),\r\n                            Mobile:pNode.find(\".mobile i\").text(),\r\n                            WebSite:pNode.find(\".website i\").text()\r\n                        }\r\n                        var QRcodeURL=\"http://www.mayacode.com/api.php?uid=1&from=maya&v=1&f=1&t=1&sid=01&Name=\"+QRcode.Name+\"&Title=\"+QRcode.Title+\"&Department=\"+QRcode.Department+\"&Company=\"+QRcode.Company+\"&Zipcode=\"+QRcode.Zipcode+\"&Phone=\"+QRcode.Phone+\"&Fax=\"+QRcode.Fax+\"&Mobile=\"+QRcode.Mobile+\"&WebSite=\"+QRcode.WebSite;\r\n                        var Qrcode=\"<img src=\"+window.encodeURI(QRcodeURL)+\" style='margin:-20px -25px' height='306' width='306' />\";\r\n                        art.dialog({title:false,content:Qrcode});\r\n                    }\r\n                    /****全局信息提示****/\r\n                    function message(c){\r\n                        art.dialog({time: 2000,padding:0,title:false,lock:false,content:\"<div class='im_infos'><p>\"+c+\"</p></div>\",cancel:false});\r\n                    }\r\n                });\r\n                if(options.autoLogin||options.defaultWindow!=\"\"){ $(\"#fn_imbar.im_login\").click();}\r\n            });\r\n        }\r\n    });\r\n\r\n})(jQuery);\r\n/****禁止粘贴****/\r\nfunction msgPaste(){\r\n    art.dialog({time: 2000,padding:0,title:false,lock:false,content:\"<div class='im_infos'><p>为营造一个良好的网络环境，暂不允许粘贴！</p></div>\",cancel:false});\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "set/Jcrop/css/jquery.Jcrop.css",
    "content": "/* jquery.Jcrop.css v0.9.10 - MIT License */\n\n/*\n  The outer-most container in a typical Jcrop instance\n  If you are having difficulty with formatting related to styles\n  on a parent element, place any fixes here or in a like selector\n\n  You can also style this element if you want to add a border, etc\n  A better method for styling can be seen below with .jcrop-light\n  (Add a class to the holder and style elements for that extended class)\n*/\n.jcrop-holder {\n  direction: ltr;\n  text-align: left;\n}\n\n/* These styles define the border lines */\n.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;}\n.jcrop-vline{height:100%;width:1px!important;}\n.jcrop-hline{height:1px!important;width:100%;}\n.jcrop-vline.right{right:0;}\n.jcrop-hline.bottom{bottom:0;}\n\n/* Handle style - size is set by Jcrop handleSize option (currently) */\n.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}\n\n/* This style is used for invisible click targets */\n.jcrop-tracker\n{\n  height: 100%; \n  width: 100%;\n  -webkit-tap-highlight-color: transparent; /* \"turn off\" link highlight */\n  -webkit-touch-callout: none;              /* disable callout, image save panel */\n  -webkit-user-select: none;                /* disable cut copy paste */\n}\n\n/* Positioning of handles and drag bars */\n.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}\n.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}\n.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}\n.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}\n.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}\n.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}\n.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}\n.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}\n.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}\n.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}\n.jcrop-dragbar.ord-n{margin-top:-4px;}\n.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}\n.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}\n.jcrop-dragbar.ord-w{margin-left:-4px;}\n\n/* The \"jcrop-light\" class/extension */\n.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline\n{\n\tbackground:#FFF;\n\tfilter:Alpha(opacity=70)!important;\n\topacity:.70!important;\n}\n.jcrop-light .jcrop-handle\n{\n\t-moz-border-radius:3px;\n\t-webkit-border-radius:3px;\n\tbackground-color:#000;\n\tborder-color:#FFF;\n\tborder-radius:3px;\n}\n\n/* The \"jcrop-dark\" class/extension */\n.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline\n{\n\tbackground:#000;\n\tfilter:Alpha(opacity=70)!important;\n\topacity:.7!important;\n}\n.jcrop-dark .jcrop-handle\n{\n\t-moz-border-radius:3px;\n\t-webkit-border-radius:3px;\n\tbackground-color:#FFF;\n\tborder-color:#000;\n\tborder-radius:3px;\n}\n\n/* Fix for twitter bootstrap et al. */\n.jcrop-holder img,img.jcrop-preview{ max-width: none; }\n"
  },
  {
    "path": "set/Jcrop/demos/crop.php",
    "content": "<?php\n\n/**\n * Jcrop image cropping plugin for jQuery\n * Example cropping script\n * @copyright 2008-2009 Kelly Hallman\n * More info: http://deepliquid.com/content/Jcrop_Implementation_Theory.html\n */\n\nif ($_SERVER['REQUEST_METHOD'] == 'POST')\n{\n\t$targ_w = $targ_h = 150;\n\t$jpeg_quality = 90;\n\n\t$src = 'demo_files/pool.jpg';\n\t$img_r = imagecreatefromjpeg($src);\n\t$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );\n\n\timagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],\n\t$targ_w,$targ_h,$_POST['w'],$_POST['h']);\n\n\theader('Content-type: image/jpeg');\n\timagejpeg($dst_r,null,$jpeg_quality);\n\n\texit;\n}\n\n// If not a POST request, display page below:\n\n?><!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\t<head>\n\n\t\t<script src=\"../js/jquery.min.js\"></script>\n\t\t<script src=\"../js/jquery.Jcrop.js\"></script>\n\t\t<link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n\t\t<link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n\n\t\t<script language=\"Javascript\">\n\n\t\t\t$(function(){\n\n\t\t\t\t$('#cropbox').Jcrop({\n\t\t\t\t\taspectRatio: 1,\n\t\t\t\t\tonSelect: updateCoords\n\t\t\t\t});\n\n\t\t\t});\n\n\t\t\tfunction updateCoords(c)\n\t\t\t{\n\t\t\t\t$('#x').val(c.x);\n\t\t\t\t$('#y').val(c.y);\n\t\t\t\t$('#w').val(c.w);\n\t\t\t\t$('#h').val(c.h);\n\t\t\t};\n\n\t\t\tfunction checkCoords()\n\t\t\t{\n\t\t\t\tif (parseInt($('#w').val())) return true;\n\t\t\t\talert('Please select a crop region then press submit.');\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t</script>\n\n\t</head>\n\n\t<body>\n\n\t<div id=\"outer\">\n\t<div class=\"jcExample\">\n\t<div class=\"article\">\n\n\t\t<h1>Jcrop - Crop Behavior</h1>\n\n\t\t<!-- This is the image we're attaching Jcrop to -->\n\t\t<img src=\"demo_files/pool.jpg\" id=\"cropbox\" />\n\n\t\t<!-- This is the form that our event handler fills -->\n\t\t<form action=\"crop.php\" method=\"post\" onsubmit=\"return checkCoords();\">\n\t\t\t<input type=\"hidden\" id=\"x\" name=\"x\" />\n\t\t\t<input type=\"hidden\" id=\"y\" name=\"y\" />\n\t\t\t<input type=\"hidden\" id=\"w\" name=\"w\" />\n\t\t\t<input type=\"hidden\" id=\"h\" name=\"h\" />\n\t\t\t<input type=\"submit\" value=\"Crop Image\" />\n\t\t</form>\n\n\t\t<p>\n\t\t\t<b>An example server-side crop script.</b> Hidden form values\n\t\t\tare set when a selection is made. If you press the <i>Crop Image</i>\n\t\t\tbutton, the form will be submitted and a 150x150 thumbnail will be\n\t\t\tdumped to the browser. Try it!\n\t\t</p>\n\n\t\t<div id=\"dl_links\">\n\t\t\t<a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n\t\t\t<a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n\t\t</div>\n\n\n\t</div>\n\t</div>\n\t</div>\n\t</body>\n\n</html>\n"
  },
  {
    "path": "set/Jcrop/demos/demo_files/demos.css",
    "content": "/* Jcrop Demo CSS\n * Not required to run Jcrop\n * Just makes the demo pages look less ugly\n */\n\nbody\n{\n  margin: 0;\n  padding: 0;\n  background: #eee;\n  font-family: Calibri, sans-serif;\n}\n\n.article h1\n{\n  color: #333;\n  font-size: 2.2em;\n  margin-top: .2em;\n}\n\n.jcropper-holder { border: 1px black solid; }\n\n#outer { text-align: center; }\n\n.jcExample\n{\n  text-align: left;\n  background: white;\n  width: 700px;\n  font-size: 80%;\n  margin: 1.5em auto 2em auto;\n  border: 1px #999 solid;\n  padding: 1em 2em 2em;\n}\n\n.jcExample .article { width: 565px; }\n\nform { margin: 1.5em 0; }\nform.coords label { margin-right: 1em; font-weight: bold; color: #900; }\nform.coords input { width: 3em; }\n\n.ui-button { font-size: 10pt; }\n.ui-dialog { font-size: 9pt; }\n.ui-state-default { font-size: 9pt; }\n.ui-widget-overlay { opacity: 0.80; filter: Alpha(opacity=70); }\n.jc-dialog { padding-top: 1em; }\n.ui-dialog p tt { color: yellow; }\n\nli small { font-style: normal; color: #CF4429; font-size: 11px; }\n\n.jcrop-light .jcrop-selection {\n  -moz-box-shadow: 0px 0px 15px #999; /* Firefox */\n  -webkit-box-shadow: 0px 0px 15px #999; /* Safari, Chrome */\n  box-shadow: 0px 0px 15px #999; /* CSS3 */\n}\n .jcrop-dark .jcrop-selection {\n  -moz-box-shadow: 0px 0px 15px #000; /* Firefox */\n  -webkit-box-shadow: 0px 0px 15px #000; /* Safari, Chrome */\n  box-shadow: 0px 0px 15px #000; /* CSS3 */\n}\n\n.jcrop-fancy .jcrop-handle.ord-e {\n  -webkit-border-top-left-radius: 0px;\n  -webkit-border-bottom-left-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-w {\n  -webkit-border-top-right-radius: 0px;\n  -webkit-border-bottom-right-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-nw {\n  -webkit-border-bottom-right-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-ne {\n  -webkit-border-bottom-left-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-sw {\n  -webkit-border-top-right-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-se {\n  -webkit-border-top-left-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-s {\n  -webkit-border-top-left-radius: 0px;\n  -webkit-border-top-right-radius: 0px;\n}\n.jcrop-fancy .jcrop-handle.ord-n {\n  -webkit-border-bottom-left-radius: 0px;\n  -webkit-border-bottom-right-radius: 0px;\n}\n"
  },
  {
    "path": "set/Jcrop/demos/jquery-ui.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Hello World</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/vader/jquery-ui.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <script type=\"text/javascript\">\n\n    jQuery(function($){\n\n      // How easy is this??\n      $('#jc-hidden-image').Jcrop();\n      $('button.ui-button').button();\n\n      // Attach hidden dialog button click event\n      $('#jc-hidden-btn').click(function(){\n        $('#jc-hidden-dialog').dialog({\n          modal: true,\n          width: (parseInt($('#jc-hidden-image').width())+34)+'px',\n          title: 'Jcrop in jQuery-ui Dialog (Hidden)',\n          resizable: false\n        });\n        return false;\n      });\n\n      $('#jc-dyn-btn').click(function(){\n        var jcrop_api;\n        var $dialog = $('<div><div class=\"jc-dialog\"><img src=\"demo_files/sago.jpg\" /></div></div>');\n        $dialog.find('img').Jcrop({},function(){\n          jcrop_api = this;\n          $dialog.dialog({\n            modal: true,\n            title: 'Jcrop in jQuery-ui Dialog (Dynamic)',\n            close: function(){ $dialog.remove(); },\n            width: jcrop_api.getBounds()[0]+34,\n            resizable: false\n          })\n        });\n        $dialog.append('<p><b>This dialog was dynamically created in Javascript.</b><br />'+\n          'Jcrop was attached to the image, and the dialog opened when Jcrop finished.</p>');\n        return false;\n      });\n\n      $('#tabs-2 img').Jcrop({\n        setSelect: [10,10,200,200]\n      });\n      $('#tabs').tabs();\n\n    });\n\n    </script>\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - jQuery UI Example</h1>\n\n\n      <!-- Hidden dialog -->\n      <div style=\"display:none;\" id=\"jc-hidden-dialog\">\n      <div class=\"jc-dialog\">\n        <img src=\"demo_files/sago.jpg\" id=\"jc-hidden-image\" />\n      </div>\n        <p><b>This dialog is embedded on the page in a hidden container.</b><br />\n        The container is rendered with <tt>style=\"display:none;\"</tt> set.</p>\n      </div>\n      <!-- /Hidden dialog -->\n\n      <p>\n        <b>This example demonstrates more complex invocations of Jcrop.</b>\n        These techniques can be integrated with other libraries or more\n        complex user interfaces.\n      </p>\n\n      <div style=\"margin: 1em 0;\">\n      <div id=\"tabs\">\n        <ul>\n          <li><a href=\"#tabs-1\">About jQuery-ui Demos</a></li>\n          <li><a href=\"#tabs-2\">Jcrop in Tab</a></li>\n        </ul>\n        <div id=\"tabs-1\">\n          <p>\n            Prior to v0.9.10 release, it was difficult to instantiate Jcrop\n            on an image unless it was visible on the page. This meant that\n            opening Jcrop in a dialog or a hidden tab was problematic, and\n            involved specific timing (e.g. attaching the Jcrop method\n            call to an \"open\" handler for the UI element).\n          </p>\n          <p>\n            This demo shows simple invocations of Jcrop using jQuery UI. If\n            you are using a different library to produce dialog boxes or tabs,\n            the theory of operation should be similar.\n          </p>\n          <button class=\"ui-button\" id=\"jc-hidden-btn\">Hidden Dialog</button>\n          <button class=\"ui-button\" id=\"jc-dyn-btn\">Dynamic Dialog</button>\n        </div>\n        <div id=\"tabs-2\">\n          <img src=\"demo_files/pool.jpg\" />\n        </div>\n      </div>\n      </div>\n\n      <div id=\"dl_links\">\n        <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n        <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n      </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/demos/non-image.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Non-Image</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <script type=\"text/javascript\">\n\n    jQuery(function($){\n\n      // I did JSON.stringify(jcrop_api.tellSelect()) on a crop I liked:\n      var c = {\"x\":13,\"y\":7,\"x2\":487,\"y2\":107,\"w\":474,\"h\":100};\n\n      $('#target').Jcrop({\n        bgFade: true,\n        setSelect: [c.x,c.y,c.x2,c.y2]\n      });\n\n    });\n\n    </script>\n    <style type=\"text/css\">\n      #target {\n        background-color: #ccc;\n        width: 500px;\n        height: 330px;\n        font-size: 24px;\n        display: block;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - Non-Image</h1>\n      <p id=\"target\">\n        <b style=\"display:block; padding: .5em 1em;\">\n          This is an example of attaching Jcrop to a target that is not an image. You are now cropping a paragraph tag.\n        </b>\n      </p>\n\n      <p>\n        <b>Attaching Jcrop to a non-image element.</b>\n        This is mostly useful to implement other interfaces, such as <tt>canvas</tt> or over an arbitrary <tt>div</tt>.\n      </p>\n\n      <div id=\"dl_links\">\n        <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n        <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n      </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/demos/styling.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Styling Example</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.color.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/vader/jquery-ui.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <script type=\"text/javascript\">\n\n    jQuery(function($){\n\n      var api;\n\n      $('#target').Jcrop({\n        // start off with jcrop-light class\n        bgOpacity: 0.5,\n        bgColor: 'white',\n        addClass: 'jcrop-light'\n      },function(){\n        api = this;\n        api.setSelect([130,65,130+350,65+285]);\n        api.setOptions({ bgFade: true });\n        api.ui.selection.addClass('jcrop-selection');\n      });\n\n      // Attach some button handlers\n      $('#radio2').click(function(){\n        api.ui.holder.removeClass('jcrop-light');\n        api.ui.holder.addClass('jcrop-dark');\n        api.setOptions({ bgColor: 'black', bgOpacity: 0.4 });\n        return false;\n      });\n      $('#radio1').click(function(){\n        api.ui.holder.removeClass('jcrop-dark');\n        api.ui.holder.addClass('jcrop-light');\n        api.setOptions({ bgColor: 'white', bgOpacity: 0.5 });\n        return false;\n      });\n      $('#radio3').click(function(){\n        api.ui.holder.removeClass('jcrop-dark');\n        api.ui.holder.removeClass('jcrop-light');\n        api.setOptions({ bgColor: 'black', bgOpacity: 0.6 });\n        return false;\n      });\n\n      $('#radioset').buttonset();\n\n    });\n\n    </script>\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - Styling Example</h1>\n      <img src=\"demo_files/pool.jpg\" id=\"target\" alt=\"Flowers\" />\n\n      <div style=\"margin-top:1em; width:500px;\">\n      <fieldset>\n      <legend>Manipulate classes</legend>\n        <div id=\"radioset\">\n          <input type=\"radio\" id=\"radio1\" name=\"radio\" checked=\"checked\" /><label for=\"radio1\">jcrop-light</label>\n          <input type=\"radio\" id=\"radio2\" name=\"radio\" /><label for=\"radio2\">jcrop-dark</label>\n          <input type=\"radio\" id=\"radio3\" name=\"radio\" /><label for=\"radio3\">normal</label>\n        </div>\n      </fieldset>\n      </div>\n\n      <p>\n        <b>Example styling tricks.</b> Click the buttons above to change the appearance of Jcrop in real-time.\n      </p>\n\n      <div id=\"dl_links\">\n        <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n        <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n      </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/demos/tutorial1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Hello World</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <script type=\"text/javascript\">\n\n    jQuery(function($){\n\n      // How easy is this??\n      $('#target').Jcrop();\n\n    });\n\n    </script>\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - Hello World</h1>\n      <img src=\"demo_files/pool.jpg\" id=\"target\" alt=\"Flowers\" />\n\n      <p>\n        <b>This example demonstrates the default behavior of Jcrop.</b>\n        Since no event handlers have been attached it only performs\n        the cropping behavior.\n      </p>\n\n      <div id=\"dl_links\">\n        <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n        <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n      </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/demos/tutorial2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Event Handler</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <script type=\"text/javascript\">\n\n    jQuery(function($){\n\n      $('#target').Jcrop({\n        onChange:   showCoords,\n        onSelect:   showCoords,\n        onRelease:  clearCoords\n      });\n\n    });\n\n    // Simple event handler, called from onChange and onSelect\n    // event handlers, as per the Jcrop invocation above\n    function showCoords(c)\n    {\n      $('#x1').val(c.x);\n      $('#y1').val(c.y);\n      $('#x2').val(c.x2);\n      $('#y2').val(c.y2);\n      $('#w').val(c.w);\n      $('#h').val(c.h);\n    };\n\n    function clearCoords()\n    {\n      $('#coords input').val('');\n    };\n\n    </script>\n  </head>\n  <body>\n  <div id=\"outer\">\n  <div class=\"jcExample\">\n  <div class=\"article\">\n\n    <h1>Jcrop - Event Handlers</h1>\n\n    <!-- This is the image we're attaching Jcrop to -->\n    <img src=\"demo_files/pool.jpg\" id=\"target\" alt=\"Flowers\" />\n\n    <!-- This is the form that our event handler fills -->\n    <form id=\"coords\"\n      class=\"coords\"\n      onsubmit=\"return false;\"\n      action=\"http://example.com/post.php\">\n\n      <div>\n      <label>X1 <input type=\"text\" size=\"4\" id=\"x1\" name=\"x1\" /></label>\n      <label>Y1 <input type=\"text\" size=\"4\" id=\"y1\" name=\"y1\" /></label>\n      <label>X2 <input type=\"text\" size=\"4\" id=\"x2\" name=\"x2\" /></label>\n      <label>Y2 <input type=\"text\" size=\"4\" id=\"y2\" name=\"y2\" /></label>\n      <label>W <input type=\"text\" size=\"4\" id=\"w\" name=\"w\" /></label>\n      <label>H <input type=\"text\" size=\"4\" id=\"h\" name=\"h\" /></label>\n      </div>\n    </form>\n\n    <p>\n      <b>An example with a basic event handler.</b> Here we've tied\n      several form values together with a simple event handler invocation.\n      The result is that the form values are updated in real-time as\n      the selection is changed using Jcrop's <em>onChange</em> handler.\n    </p>\n\n    <p>\n      That's how easily Jcrop can be integrated into a traditional web form!\n    </p>\n\n    <div id=\"dl_links\">\n      <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n      <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n    </div>\n\n\n  </div>\n  </div>\n  </div>\n  </body>\n\n</html>\n"
  },
  {
    "path": "set/Jcrop/demos/tutorial3.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jquery.Jcrop.css\" media=\"all\">\n</head>\n<body>\n<img src=\"temp/pool.jpg\" id=\"target\" alt=\"Flowers\" />\n<div style=\"width:50px;height:50px;overflow:hidden;\">\n    <img src=\"temp/pool.jpg\" id=\"preview_b\" alt=\"Preview\" class=\"jcrop-preview\" />\n</div>\n<div style=\"width:30px;height:30px;overflow:hidden;\">\n    <img src=\"temp/pool.jpg\" id=\"preview_s\" alt=\"Preview\" class=\"jcrop-preview\" />\n</div>\n<script type=\"text/javascript\" src=\"../js/jQuery-1.7.1.min.js\"></script>\n<script type=\"text/javascript\" src=\"js/jquery.Jcrop.js\"></script>\n\n<script type=\"text/javascript\">\n    jQuery(function($){\n        var jcrop_api, boundx, boundy;\n        $('#target').Jcrop({\n            onChange: updatePreview,\n            onSelect: updatePreview,\n            aspectRatio: 1\n        },function(){\n            var bounds = this.getBounds();\n            boundx = bounds[0];\n            boundy = bounds[1];\n            jcrop_api = this;\n        });\n        function updatePreview(c)\n        {\n            if (parseInt(c.w) > 0)\n            {\n                var rxb = 50 / c.w;\n                var ryb = 50 / c.h;\n                var rxs = 30 / c.w;\n                var rys = 30 / c.h;\n                $('#preview_b').css({\n                    width: Math.round(rxb * boundx) + 'px',\n                    height: Math.round(ryb * boundy) + 'px',\n                    marginLeft: '-' + Math.round(rxb * c.x) + 'px',\n                    marginTop: '-' + Math.round(ryb * c.y) + 'px'\n                });\n                $('#preview_s').css({\n                    width: Math.round(rxs * boundx) + 'px',\n                    height: Math.round(rys * boundy) + 'px',\n                    marginLeft: '-' + Math.round(rxs * c.x) + 'px',\n                    marginTop: '-' + Math.round(rys * c.y) + 'px'\n                });\n            }\n        };\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "set/Jcrop/demos/tutorial4.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; Animations / Transitions</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.color.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.extras.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n\n    <script type=\"text/javascript\">\n\n      jQuery(function($){\n\n        var jcrop_api;\n\n        $('#target').Jcrop({\n          bgFade:     true,\n          bgOpacity: .3,\n          setSelect: [ 60, 70, 540, 330 ]\n        },function(){\n          jcrop_api = this;\n        });\n\n        $('#fadetog').change(function(){\n          jcrop_api.setOptions({\n            bgFade: this.checked\n          });\n        }).attr('checked','checked');\n\n        $('#shadetog').change(function(){\n          if (this.checked) $('#shadetxt').slideDown();\n            else $('#shadetxt').slideUp();\n          jcrop_api.setOptions({\n            shade: this.checked\n          });\n        }).attr('checked',false);\n\n        // Define page sections\n        var sections = {\n          anim_buttons: 'Animate Selection',\n          bgo_buttons: 'Change bgOpacity',\n          bgc_buttons: 'Change bgColor'\n        };\n        // Define animation buttons\n        var ac = {\n          anim1: [217,122,382,284],\n          anim2: [20,20,580,380],\n          anim3: [24,24,176,376],\n          anim4: [347,165,550,355],\n          anim5: [136,55,472,183]\n        };\n        // Define bgOpacity buttons\n        var bgo = {\n          Low: .2,\n          Mid: .5,\n          High: .8,\n          Full: 1\n        };\n        // Define bgColor buttons\n        var bgc = {\n          Red: '#900',\n          Blue: '#4BB6F0',\n          Yellow: '#F0B207',\n          Green: '#46B81C',\n          White: 'white',\n          Black: 'black'\n        };\n        // Create fieldset targets for buttons\n        for(i in sections)\n          insertSection(i,sections[i]);\n\n        // Create animation buttons\n        for(i in ac) {\n          $('#anim_buttons').append(\n            $('<button />').append(i).click(animHandler(ac[i])), ' '\n          );\n        }\n        // Create bgOpacity buttons\n        for(i in bgo) {\n          $('#bgo_buttons').append(\n            $('<button />').append(i).click(setoptHandler('bgOpacity',bgo[i])), ' '\n          );\n        }\n        // Create bgColor buttons\n        for(i in bgc) {\n          $('#bgc_buttons').append(\n            $('<button />').append(i).css({\n              backgroundColor: bgc[i],\n              color: ((i == 'Black') || (i == 'Red'))?'white':'black'\n            }).click(setoptHandler('bgColor',bgc[i])), ' '\n          );\n        }\n        // Function to insert named sections into interface\n        function insertSection(k,v) {\n          $('#interface').append(\n            $('<fieldset></fieldset>').attr('id',k).append(\n              $('<legend></legend>').append(v)\n            )\n          );\n        };\n        // Handler for option-setting buttons\n        function setoptHandler(k,v) {\n          return function() {\n            var opt = { };\n            opt[k] = v;\n            jcrop_api.setOptions(opt);\n            return false;\n          };\n        };\n        // Handler for animation buttons\n        function animHandler(v) {\n          return function() {\n            jcrop_api.animateTo(v);\n            return false;\n          };\n        };\n\n        $('#anim_buttons').append(\n          $('<button></button>').append('Bye!').click(function(){\n            jcrop_api.animateTo(\n              [300,200,300,200],\n              function(){ this.release(); }\n            );\n            return false;\n          })\n        );\n\n        $('#interface').show();\n\n      });\n\n    </script>\n\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - Animations/Transitions</h1>\n      <img src=\"demo_files/sago.jpg\" id=\"target\" alt=\"Flowers\" />\n\n      <div id=\"interface\" style=\"margin: 1em 0;\"></div>\n      <div><label><input type=\"checkbox\" id=\"fadetog\" /> Enable fading (bgFade: true)</label></div>\n      <div><label><input type=\"checkbox\" id=\"shadetog\" /> Use experimental shader (shade: true)</label></div>\n\n      <p id=\"shadetxt\" style=\"display:none; color:#900;\">\n        <b>Experimental shader active.</b>\n        Jcrop now includes a shading mode that facilitates building\n        better transparent Jcrop instances. The experimental shader is less\n        robust than Jcrop's default shading method and should only be\n        used if you require this functionality. \n      </p>\n\n      <p>\n        <b>Animation/Transitions.</b>\n        Demonstration of animateTo API method and transitions for bgColor\n        and bgOpacity options. Color fading requires inclusion of John Resig's\n        jQuery <a href=\"http://plugins.jquery.com/project/color\">Color \n        Animations</a> plugin. If it is not included, colors will not fade.\n      </p>\n\n    <div id=\"dl_links\">\n      <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n      <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n    </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/demos/tutorial5.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" /> \n    <title>Jcrop &raquo; Tutorials &raquo; API Demo</title>\n    <script src=\"../js/jquery.min.js\" type=\"text/javascript\"></script>\n    <script src=\"../js/jquery.Jcrop.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" href=\"../css/jquery.Jcrop.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"demo_files/demos.css\" type=\"text/css\" />\n    <style type=\"text/css\">\n      .optdual { position: relative; }\n      .optdual .offset { position: absolute; left: 18em; }\n      .optlist label { width: 16em; display: block; }\n      #dl_links { margin-top: .5em; }\n    </style>\n    <script type=\"text/javascript\">\n\n      jQuery(function($){\n\n        // The variable jcrop_api will hold a reference to the\n        // Jcrop API once Jcrop is instantiated.\n        var jcrop_api;\n\n        // In this example, since Jcrop may be attached or detached\n        // at the whim of the user, I've wrapped the call into a function\n        initJcrop();\n        \n        // The function is pretty simple\n        function initJcrop()//{{{\n        {\n          // Hide any interface elements that require Jcrop\n          // (This is for the local user interface portion.)\n          $('.requiresjcrop').hide();\n\n          // Invoke Jcrop in typical fashion\n          $('#target').Jcrop({\n            onRelease: releaseCheck\n          },function(){\n\n            jcrop_api = this;\n            jcrop_api.animateTo([100,100,400,300]);\n\n            // Setup and dipslay the interface for \"enabled\"\n            $('#can_click,#can_move,#can_size').attr('checked','checked');\n            $('#ar_lock,#size_lock,#bg_swap').attr('checked',false);\n            $('.requiresjcrop').show();\n\n          });\n\n        };\n        //}}}\n\n        // Use the API to find cropping dimensions\n        // Then generate a random selection\n        // This function is used by setSelect and animateTo buttons\n        // Mainly for demonstration purposes\n        function getRandom() {\n          var dim = jcrop_api.getBounds();\n          return [\n            Math.round(Math.random() * dim[0]),\n            Math.round(Math.random() * dim[1]),\n            Math.round(Math.random() * dim[0]),\n            Math.round(Math.random() * dim[1])\n          ];\n        };\n\n        // This function is bound to the onRelease handler...\n        // In certain circumstances (such as if you set minSize\n        // and aspectRatio together), you can inadvertently lose\n        // the selection. This callback re-enables creating selections\n        // in such a case. Although the need to do this is based on a\n        // buggy behavior, it's recommended that you in some way trap\n        // the onRelease callback if you use allowSelect: false\n        function releaseCheck()\n        {\n          jcrop_api.setOptions({ allowSelect: true });\n          $('#can_click').attr('checked',false);\n        };\n\n        // Attach interface buttons\n        // This may appear to be a lot of code but it's simple stuff\n        $('#setSelect').click(function(e) {\n          // Sets a random selection\n          jcrop_api.setSelect(getRandom());\n        });\n        $('#animateTo').click(function(e) {\n          // Animates to a random selection\n          jcrop_api.animateTo(getRandom());\n        });\n        $('#release').click(function(e) {\n          // Release method clears the selection\n          jcrop_api.release();\n        });\n        $('#disable').click(function(e) {\n          // Disable Jcrop instance\n          jcrop_api.disable();\n          // Update the interface to reflect disabled state\n          $('#enable').show();\n          $('.requiresjcrop').hide();\n        });\n        $('#enable').click(function(e) {\n          // Re-enable Jcrop instance\n          jcrop_api.enable();\n          // Update the interface to reflect enabled state\n          $('#enable').hide();\n          $('.requiresjcrop').show();\n        });\n        $('#rehook').click(function(e) {\n          // This button is visible when Jcrop has been destroyed\n          // It performs the re-attachment and updates the UI\n          $('#rehook,#enable').hide();\n          initJcrop();\n          $('#unhook,.requiresjcrop').show();\n          return false;\n        });\n        $('#unhook').click(function(e) {\n          // Destroy Jcrop widget, restore original state\n          jcrop_api.destroy();\n          // Update the interface to reflect un-attached state\n          $('#unhook,#enable,.requiresjcrop').hide();\n          $('#rehook').show();\n          return false;\n        });\n\n        // Hook up the three image-swapping buttons\n        $('#img1').click(function(e) {\n          jcrop_api.setImage('demo_files/sago.jpg');\n          jcrop_api.setOptions({ bgOpacity: .6 });\n          return false;\n        });\n        $('#img2').click(function(e) {\n          jcrop_api.setImage('demo_files/pool.jpg');\n          jcrop_api.setOptions({ bgOpacity: .6 });\n          return false;\n        });\n        $('#img3').click(function(e) {\n          jcrop_api.setImage('demo_files/sago.jpg',function(){\n            this.setOptions({\n              bgOpacity: 1,\n              outerImage: 'demo_files/sagomod.jpg'\n            });\n            this.animateTo(getRandom());\n          });\n          return false;\n        });\n\n        // The checkboxes simply set options based on it's checked value\n        // Options are changed by passing a new options object\n\n        // Also, to prevent strange behavior, they are initially checked\n        // This matches the default initial state of Jcrop\n\n        $('#can_click').change(function(e) {\n          jcrop_api.setOptions({ allowSelect: !!this.checked });\n          jcrop_api.focus();\n        });\n        $('#can_move').change(function(e) {\n          jcrop_api.setOptions({ allowMove: !!this.checked });\n          jcrop_api.focus();\n        });\n        $('#can_size').change(function(e) {\n          jcrop_api.setOptions({ allowResize: !!this.checked });\n          jcrop_api.focus();\n        });\n        $('#ar_lock').change(function(e) {\n          jcrop_api.setOptions(this.checked?\n            { aspectRatio: 4/3 }: { aspectRatio: 0 });\n          jcrop_api.focus();\n        });\n        $('#size_lock').change(function(e) {\n          jcrop_api.setOptions(this.checked? {\n            minSize: [ 80, 80 ],\n            maxSize: [ 350, 350 ]\n          }: {\n            minSize: [ 0, 0 ],\n            maxSize: [ 0, 0 ]\n          });\n          jcrop_api.focus();\n        });\n\n      });\n\n    </script>\n\n  </head>\n\n  <body>\n    <div id=\"outer\">\n    <div class=\"jcExample\">\n    <div class=\"article\">\n\n      <h1>Jcrop - API Demo</h1>\n      <img src=\"demo_files/sago.jpg\" id=\"target\" alt=\"Jcrop Image\" />\n\n      <div style=\"margin: .8em 0 .5em;\">\n        <span class=\"requiresjcrop\">\n          <button id=\"setSelect\">setSelect</button>\n          <button id=\"animateTo\">animateTo</button>\n          <button id=\"release\">Release</button>\n          <button id=\"disable\">Disable</button>\n        </span>\n        <button id=\"enable\" style=\"display:none;\">Re-Enable</button>\n        <button id=\"unhook\">Destroy!</button>\n        <button id=\"rehook\" style=\"display:none;\">Attach Jcrop</button>\n      </div>\n\n      <fieldset class=\"optdual requiresjcrop\">\n        <legend>Option Toggles</legend>\n        <div class=\"optlist offset\">\n          <label><input type=\"checkbox\" id=\"ar_lock\" />Aspect ratio</label>\n          <label><input type=\"checkbox\" id=\"size_lock\" />minSize/maxSize setting</label>\n        </div>\n        <div class=\"optlist\">\n          <label><input type=\"checkbox\" id=\"can_click\" />Allow new selections</label>\n          <label><input type=\"checkbox\" id=\"can_move\" />Selection can be moved</label>\n          <label><input type=\"checkbox\" id=\"can_size\" />Resizable selection</label>\n        </div>\n      </fieldset>\n\n      <fieldset class=\"requiresjcrop\" style=\"margin: .5em 0;\">\n        <legend>Change Image</legend>\n        <span>\n          <button id=\"img2\">Pool</button>\n          <button id=\"img1\">Sago</button>\n          <button id=\"img3\">Sago w/ outerImage</button>\n        </span>\n      </fieldset>\n\n    <div id=\"dl_links\">\n      <a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a> |\n      <a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Manual (Docs)</a>\n    </div>\n\n    </div>\n    </div>\n    </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "set/Jcrop/index.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n  <title>Jcrop: the jQuery Image Cropping Plugin</title>\n  <link rel=\"stylesheet\" href=\"demos/demo_files/demos.css\" type=\"text/css\" />\n  <meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" />\n</head>\n<body>\n\n\t<div id=\"outer\">\n\t<div class=\"jcExample\">\n\t<div class=\"article\">\n<h1>Jcrop Image Cropping Plugin</h1>\n\n<big>\n\t<a href=\"http://deepliquid.com/content/Jcrop.html\"><b>Jcrop</b></a>\n\tis the image cropping plugin for\n\t<a href=\"http://jquery.com/\">jQuery</a>.<br />\n\tYou've successfully unpacked Jcrop.\n</big>\n\n<h3>Static Demos</h3>\n\n<ul>\n\t<li><a href=\"demos/tutorial1.html\">Hello World</a>\n\t\t&mdash; default behavior</li>\n\t<li><a href=\"demos/tutorial2.html\">Basic Handler</a>\n\t\t&mdash; basic form integration</li>\n\t<li><a href=\"demos/tutorial3.html\">Aspect Ratio w/ Preview Pane</a>\n\t\t&mdash; nice visual example</li>\n\t<li><a href=\"demos/tutorial4.html\">Animation/Transitions</a>\n\t\t&mdash; animation/fading demo</li>\n\t<li><a href=\"demos/tutorial5.html\">API Interface</a>\n\t\t&mdash; real-time API example</li>\n\t<li><a href=\"demos/jquery-ui.html\">jQuery UI Demo</a>\n\t\t&mdash; invoking Jcrop in dialogs and hidden tabs\n    <small>New in 0.9.10</small>\n    </li>\n\t<li><a href=\"demos/styling.html\">Styling Example</a>\n\t\t&mdash; style Jcrop dynamically with CSS\n    <small>New in 0.9.10</small>\n    </li>\n  <li><a href=\"demos/non-image.html\">Non-Image Elements</a>\n    &mdash; attach to other DOM block elements\n    <small>New in 0.9.10</small>\n    </li>\n</ul>\n\n<h3>Live Demo</h3>\n\n<ul>\n\t<li><a href=\"demos/crop.php\">PHP Cropping Demo</a>\n\t\t&mdash; requires PHP/gd support</li>\n</ul>\n\n<h3>Jcrop Links</h3>\n\n<ul>\n\t<li><a href=\"http://deepliquid.com/content/Jcrop.html\">Jcrop Home</a></li>\n\t<li><a href=\"http://deepliquid.com/content/Jcrop_Manual.html\">Jcrop Manual</a></li>\n</ul>\n\n<hr style=\"margin-top:2em;\" />\n<small>\n\t<b>&copy; 2008-2012 Tapmodo Interactive LLC</b><br />\n\tFree software released under <a href=\"MIT-LICENSE.txt\">MIT License</a>\n</small>\n</div>\n</div>\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "set/Jcrop/js/jquery.Jcrop.js",
    "content": "/**\n * jquery.Jcrop.js v0.9.10\n * jQuery Image Cropping Plugin - released under MIT License \n * Author: Kelly Hallman <khallman@gmail.com>\n * http://github.com/tapmodo/Jcrop\n * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * }}}\n */\n\n(function ($) {\n\n  $.Jcrop = function (obj, opt) {\n    var options = $.extend({}, $.Jcrop.defaults),\n        docOffset, lastcurs, ie6mode = false;\n\n    // Internal Methods {{{\n    function px(n) {\n      return n + 'px';\n    }\n    function cssClass(cl) {\n      return options.baseClass + '-' + cl;\n    }\n    function supportsColorFade() {\n      return $.fx.step.hasOwnProperty('backgroundColor');\n    }\n    function getPos(obj) //{{{\n    {\n      var pos = $(obj).offset();\n      return [pos.left, pos.top];\n    }\n    //}}}\n    function mouseAbs(e) //{{{\n    {\n      return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])];\n    }\n    //}}}\n    function setOptions(opt) //{{{\n    {\n      if (typeof(opt) !== 'object') opt = {};\n      options = $.extend(options, opt);\n\n      $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) {\n        if (typeof(options[e]) !== 'function') options[e] = function () {};\n      });\n    }\n    //}}}\n    function startDragMode(mode, pos) //{{{\n    {\n      docOffset = getPos($img);\n      Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');\n\n      if (mode === 'move') {\n        return Tracker.activateHandlers(createMover(pos), doneSelect);\n      }\n\n      var fc = Coords.getFixed();\n      var opp = oppLockCorner(mode);\n      var opc = Coords.getCorner(oppLockCorner(opp));\n\n      Coords.setPressed(Coords.getCorner(opp));\n      Coords.setCurrent(opc);\n\n      Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);\n    }\n    //}}}\n    function dragmodeHandler(mode, f) //{{{\n    {\n      return function (pos) {\n        if (!options.aspectRatio) {\n          switch (mode) {\n          case 'e':\n            pos[1] = f.y2;\n            break;\n          case 'w':\n            pos[1] = f.y2;\n            break;\n          case 'n':\n            pos[0] = f.x2;\n            break;\n          case 's':\n            pos[0] = f.x2;\n            break;\n          }\n        } else {\n          switch (mode) {\n          case 'e':\n            pos[1] = f.y + 1;\n            break;\n          case 'w':\n            pos[1] = f.y + 1;\n            break;\n          case 'n':\n            pos[0] = f.x + 1;\n            break;\n          case 's':\n            pos[0] = f.x + 1;\n            break;\n          }\n        }\n        Coords.setCurrent(pos);\n        Selection.update();\n      };\n    }\n    //}}}\n    function createMover(pos) //{{{\n    {\n      var lloc = pos;\n      KeyManager.watchKeys();\n\n      return function (pos) {\n        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);\n        lloc = pos;\n\n        Selection.update();\n      };\n    }\n    //}}}\n    function oppLockCorner(ord) //{{{\n    {\n      switch (ord) {\n      case 'n':\n        return 'sw';\n      case 's':\n        return 'nw';\n      case 'e':\n        return 'nw';\n      case 'w':\n        return 'ne';\n      case 'ne':\n        return 'sw';\n      case 'nw':\n        return 'se';\n      case 'se':\n        return 'nw';\n      case 'sw':\n        return 'ne';\n      }\n    }\n    //}}}\n    function createDragger(ord) //{{{\n    {\n      return function (e) {\n        if (options.disabled) {\n          return false;\n        }\n        if ((ord === 'move') && !options.allowMove) {\n          return false;\n        }\n        \n        // Fix position of crop area when dragged the very first time.\n        // Necessary when crop image is in a hidden element when page is loaded.\n        docOffset = getPos($img);\n\n        btndown = true;\n        startDragMode(ord, mouseAbs(e));\n        e.stopPropagation();\n        e.preventDefault();\n        return false;\n      };\n    }\n    //}}}\n    function presize($obj, w, h) //{{{\n    {\n      var nw = $obj.width(),\n          nh = $obj.height();\n      if ((nw > w) && w > 0) {\n        nw = w;\n        nh = (w / $obj.width()) * $obj.height();\n      }\n      if ((nh > h) && h > 0) {\n        nh = h;\n        nw = (h / $obj.height()) * $obj.width();\n      }\n      xscale = $obj.width() / nw;\n      yscale = $obj.height() / nh;\n      $obj.width(nw).height(nh);\n    }\n    //}}}\n    function unscale(c) //{{{\n    {\n      return {\n        x: c.x * xscale,\n        y: c.y * yscale,\n        x2: c.x2 * xscale,\n        y2: c.y2 * yscale,\n        w: c.w * xscale,\n        h: c.h * yscale\n      };\n    }\n    //}}}\n    function doneSelect(pos) //{{{\n    {\n      var c = Coords.getFixed();\n      if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) {\n        Selection.enableHandles();\n        Selection.done();\n      } else {\n        Selection.release();\n      }\n      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');\n    }\n    //}}}\n    function newSelection(e) //{{{\n    {\n      if (options.disabled) {\n        return false;\n      }\n      if (!options.allowSelect) {\n        return false;\n      }\n      btndown = true;\n      docOffset = getPos($img);\n      Selection.disableHandles();\n      Tracker.setCursor('crosshair');\n      var pos = mouseAbs(e);\n      Coords.setPressed(pos);\n      Selection.update();\n      Tracker.activateHandlers(selectDrag, doneSelect);\n      KeyManager.watchKeys();\n\n      e.stopPropagation();\n      e.preventDefault();\n      return false;\n    }\n    //}}}\n    function selectDrag(pos) //{{{\n    {\n      Coords.setCurrent(pos);\n      Selection.update();\n    }\n    //}}}\n    function newTracker() //{{{\n    {\n      var trk = $('<div></div>').addClass(cssClass('tracker'));\n      if ($.browser.msie) {\n        trk.css({\n          opacity: 0,\n          backgroundColor: 'white'\n        });\n      }\n      return trk;\n    }\n    //}}}\n\n    // }}}\n    // Initialization {{{\n    // Sanitize some options {{{\n    if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) {\n      ie6mode = true;\n    }\n    if (typeof(obj) !== 'object') {\n      obj = $(obj)[0];\n    }\n    if (typeof(opt) !== 'object') {\n      opt = {};\n    }\n    // }}}\n    setOptions(opt);\n    // Initialize some jQuery objects {{{\n    // The values are SET on the image(s) for the interface\n    // If the original image has any of these set, they will be reset\n    // However, if you destroy() the Jcrop instance the original image's\n    // character in the DOM will be as you left it.\n    var img_css = {\n      border: 'none',\n      visibility: 'visible',\n      margin: 0,\n      padding: 0,\n      position: 'absolute',\n      top: 0,\n      left: 0\n    };\n\n    var $origimg = $(obj),\n      img_mode = true;\n\n    if (obj.tagName == 'IMG') {\n      // Fix size of crop image.\n      // Necessary when crop image is within a hidden element when page is loaded.\n      if ($origimg[0].width != 0 && $origimg[0].height != 0) {\n        // Obtain dimensions from contained img element.\n        $origimg.width($origimg[0].width);\n        $origimg.height($origimg[0].height);\n      } else {\n        // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). \n        var tempImage = new Image();\n        tempImage.src = $origimg[0].src;\n        $origimg.width(tempImage.width);\n        $origimg.height(tempImage.height);\n      } \n\n      var $img = $origimg.clone().removeAttr('id').css(img_css).show();\n\n      $img.width($origimg.width());\n      $img.height($origimg.height());\n      $origimg.after($img).hide();\n\n    } else {\n      $img = $origimg.css(img_css).show();\n      img_mode = false;\n      if (options.shade === null) { options.shade = true; }\n    }\n\n    presize($img, options.boxWidth, options.boxHeight);\n\n    var boundx = $img.width(),\n        boundy = $img.height(),\n        \n        \n        $div = $('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({\n        position: 'relative',\n        backgroundColor: options.bgColor\n      }).insertAfter($origimg).append($img);\n\n    if (options.addClass) {\n      $div.addClass(options.addClass);\n    }\n\n    var $img2 = $('<div />'),\n\n        $img_holder = $('<div />') \n        .width('100%').height('100%').css({\n          zIndex: 310,\n          position: 'absolute',\n          overflow: 'hidden'\n        }),\n\n        $hdl_holder = $('<div />') \n        .width('100%').height('100%').css('zIndex', 320), \n\n        $sel = $('<div />') \n        .css({\n          position: 'absolute',\n          zIndex: 600\n        }).dblclick(function(){\n          var c = Coords.getFixed();\n          options.onDblClick.call(api,c);\n        }).insertBefore($img).append($img_holder, $hdl_holder); \n\n    if (img_mode) {\n\n      $img2 = $('<img />')\n          .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy),\n\n      $img_holder.append($img2);\n\n    }\n\n    if (ie6mode) {\n      $sel.css({\n        overflowY: 'hidden'\n      });\n    }\n\n    var bound = options.boundary;\n    var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({\n      position: 'absolute',\n      top: px(-bound),\n      left: px(-bound),\n      zIndex: 290\n    }).mousedown(newSelection);\n\n    /* }}} */\n    // Set more variables {{{\n    var bgcolor = options.bgColor,\n        bgopacity = options.bgOpacity,\n        xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true,\n        btndown, animating, shift_down;\n\n    docOffset = getPos($img);\n    // }}}\n    // }}}\n    // Internal Modules {{{\n    // Touch Module {{{ \n    var Touch = (function () {\n      // Touch support detection function adapted (under MIT License)\n      // from code by Jeffrey Sambells - http://github.com/iamamused/\n      function hasTouchSupport() {\n        var support = {},\n            events = ['touchstart', 'touchmove', 'touchend'],\n            el = document.createElement('div'), i;\n\n        try {\n          for(i=0; i<events.length; i++) {\n            var eventName = events[i];\n            eventName = 'on' + eventName;\n            var isSupported = (eventName in el);\n            if (!isSupported) {\n              el.setAttribute(eventName, 'return;');\n              isSupported = typeof el[eventName] == 'function';\n            }\n            support[events[i]] = isSupported;\n          }\n          return support.touchstart && support.touchend && support.touchmove;\n        }\n        catch(err) {\n          return false;\n        }\n      }\n\n      function detectSupport() {\n        if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;\n          else return hasTouchSupport();\n      }\n      return {\n        createDragger: function (ord) {\n          return function (e) {\n            e.pageX = e.originalEvent.changedTouches[0].pageX;\n            e.pageY = e.originalEvent.changedTouches[0].pageY;\n            if (options.disabled) {\n              return false;\n            }\n            if ((ord === 'move') && !options.allowMove) {\n              return false;\n            }\n            btndown = true;\n            startDragMode(ord, mouseAbs(e));\n            e.stopPropagation();\n            e.preventDefault();\n            return false;\n          };\n        },\n        newSelection: function (e) {\n          e.pageX = e.originalEvent.changedTouches[0].pageX;\n          e.pageY = e.originalEvent.changedTouches[0].pageY;\n          return newSelection(e);\n        },\n        isSupported: hasTouchSupport,\n        support: detectSupport()\n      };\n    }());\n    // }}}\n    // Coords Module {{{\n    var Coords = (function () {\n      var x1 = 0,\n          y1 = 0,\n          x2 = 0,\n          y2 = 0,\n          ox, oy;\n\n      function setPressed(pos) //{{{\n      {\n        pos = rebound(pos);\n        x2 = x1 = pos[0];\n        y2 = y1 = pos[1];\n      }\n      //}}}\n      function setCurrent(pos) //{{{\n      {\n        pos = rebound(pos);\n        ox = pos[0] - x2;\n        oy = pos[1] - y2;\n        x2 = pos[0];\n        y2 = pos[1];\n      }\n      //}}}\n      function getOffset() //{{{\n      {\n        return [ox, oy];\n      }\n      //}}}\n      function moveOffset(offset) //{{{\n      {\n        var ox = offset[0],\n            oy = offset[1];\n\n        if (0 > x1 + ox) {\n          ox -= ox + x1;\n        }\n        if (0 > y1 + oy) {\n          oy -= oy + y1;\n        }\n\n        if (boundy < y2 + oy) {\n          oy += boundy - (y2 + oy);\n        }\n        if (boundx < x2 + ox) {\n          ox += boundx - (x2 + ox);\n        }\n\n        x1 += ox;\n        x2 += ox;\n        y1 += oy;\n        y2 += oy;\n      }\n      //}}}\n      function getCorner(ord) //{{{\n      {\n        var c = getFixed();\n        switch (ord) {\n        case 'ne':\n          return [c.x2, c.y];\n        case 'nw':\n          return [c.x, c.y];\n        case 'se':\n          return [c.x2, c.y2];\n        case 'sw':\n          return [c.x, c.y2];\n        }\n      }\n      //}}}\n      function getFixed() //{{{\n      {\n        if (!options.aspectRatio) {\n          return getRect();\n        }\n        // This function could use some optimization I think...\n        var aspect = options.aspectRatio,\n            min_x = options.minSize[0] / xscale,\n            \n            \n            //min_y = options.minSize[1]/yscale,\n            max_x = options.maxSize[0] / xscale,\n            max_y = options.maxSize[1] / yscale,\n            rw = x2 - x1,\n            rh = y2 - y1,\n            rwa = Math.abs(rw),\n            rha = Math.abs(rh),\n            real_ratio = rwa / rha,\n            xx, yy, w, h;\n\n        if (max_x === 0) {\n          max_x = boundx * 10;\n        }\n        if (max_y === 0) {\n          max_y = boundy * 10;\n        }\n        if (real_ratio < aspect) {\n          yy = y2;\n          w = rha * aspect;\n          xx = rw < 0 ? x1 - w : w + x1;\n\n          if (xx < 0) {\n            xx = 0;\n            h = Math.abs((xx - x1) / aspect);\n            yy = rh < 0 ? y1 - h : h + y1;\n          } else if (xx > boundx) {\n            xx = boundx;\n            h = Math.abs((xx - x1) / aspect);\n            yy = rh < 0 ? y1 - h : h + y1;\n          }\n        } else {\n          xx = x2;\n          h = rwa / aspect;\n          yy = rh < 0 ? y1 - h : y1 + h;\n          if (yy < 0) {\n            yy = 0;\n            w = Math.abs((yy - y1) * aspect);\n            xx = rw < 0 ? x1 - w : w + x1;\n          } else if (yy > boundy) {\n            yy = boundy;\n            w = Math.abs(yy - y1) * aspect;\n            xx = rw < 0 ? x1 - w : w + x1;\n          }\n        }\n\n        // Magic %-)\n        if (xx > x1) { // right side\n          if (xx - x1 < min_x) {\n            xx = x1 + min_x;\n          } else if (xx - x1 > max_x) {\n            xx = x1 + max_x;\n          }\n          if (yy > y1) {\n            yy = y1 + (xx - x1) / aspect;\n          } else {\n            yy = y1 - (xx - x1) / aspect;\n          }\n        } else if (xx < x1) { // left side\n          if (x1 - xx < min_x) {\n            xx = x1 - min_x;\n          } else if (x1 - xx > max_x) {\n            xx = x1 - max_x;\n          }\n          if (yy > y1) {\n            yy = y1 + (x1 - xx) / aspect;\n          } else {\n            yy = y1 - (x1 - xx) / aspect;\n          }\n        }\n\n        if (xx < 0) {\n          x1 -= xx;\n          xx = 0;\n        } else if (xx > boundx) {\n          x1 -= xx - boundx;\n          xx = boundx;\n        }\n\n        if (yy < 0) {\n          y1 -= yy;\n          yy = 0;\n        } else if (yy > boundy) {\n          y1 -= yy - boundy;\n          yy = boundy;\n        }\n\n        return makeObj(flipCoords(x1, y1, xx, yy));\n      }\n      //}}}\n      function rebound(p) //{{{\n      {\n        if (p[0] < 0) {\n          p[0] = 0;\n        }\n        if (p[1] < 0) {\n          p[1] = 0;\n        }\n\n        if (p[0] > boundx) {\n          p[0] = boundx;\n        }\n        if (p[1] > boundy) {\n          p[1] = boundy;\n        }\n\n        return [p[0], p[1]];\n      }\n      //}}}\n      function flipCoords(x1, y1, x2, y2) //{{{\n      {\n        var xa = x1,\n            xb = x2,\n            ya = y1,\n            yb = y2;\n        if (x2 < x1) {\n          xa = x2;\n          xb = x1;\n        }\n        if (y2 < y1) {\n          ya = y2;\n          yb = y1;\n        }\n        return [xa, ya, xb, yb];\n      }\n      //}}}\n      function getRect() //{{{\n      {\n        var xsize = x2 - x1,\n            ysize = y2 - y1,\n            delta;\n\n        if (xlimit && (Math.abs(xsize) > xlimit)) {\n          x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);\n        }\n        if (ylimit && (Math.abs(ysize) > ylimit)) {\n          y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);\n        }\n\n        if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) {\n          y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale);\n        }\n        if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) {\n          x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale);\n        }\n\n        if (x1 < 0) {\n          x2 -= x1;\n          x1 -= x1;\n        }\n        if (y1 < 0) {\n          y2 -= y1;\n          y1 -= y1;\n        }\n        if (x2 < 0) {\n          x1 -= x2;\n          x2 -= x2;\n        }\n        if (y2 < 0) {\n          y1 -= y2;\n          y2 -= y2;\n        }\n        if (x2 > boundx) {\n          delta = x2 - boundx;\n          x1 -= delta;\n          x2 -= delta;\n        }\n        if (y2 > boundy) {\n          delta = y2 - boundy;\n          y1 -= delta;\n          y2 -= delta;\n        }\n        if (x1 > boundx) {\n          delta = x1 - boundy;\n          y2 -= delta;\n          y1 -= delta;\n        }\n        if (y1 > boundy) {\n          delta = y1 - boundy;\n          y2 -= delta;\n          y1 -= delta;\n        }\n\n        return makeObj(flipCoords(x1, y1, x2, y2));\n      }\n      //}}}\n      function makeObj(a) //{{{\n      {\n        return {\n          x: a[0],\n          y: a[1],\n          x2: a[2],\n          y2: a[3],\n          w: a[2] - a[0],\n          h: a[3] - a[1]\n        };\n      }\n      //}}}\n\n      return {\n        flipCoords: flipCoords,\n        setPressed: setPressed,\n        setCurrent: setCurrent,\n        getOffset: getOffset,\n        moveOffset: moveOffset,\n        getCorner: getCorner,\n        getFixed: getFixed\n      };\n    }());\n\n    //}}}\n    // Shade Module {{{\n    var Shade = (function() {\n      var enabled = false,\n          holder = $('<div />').css({\n            position: 'absolute',\n            zIndex: 240,\n            opacity: 0\n          }),\n          shades = {\n            top: createShade(),\n            left: createShade().height(boundy),\n            right: createShade().height(boundy),\n            bottom: createShade()\n          };\n\n      function resizeShades(w,h) {\n        shades.left.css({ height: px(h) });\n        shades.right.css({ height: px(h) });\n      }\n      function updateAuto()\n      {\n        return updateShade(Coords.getFixed());\n      }\n      function updateShade(c)\n      {\n        shades.top.css({\n          left: px(c.x),\n          width: px(c.w),\n          height: px(c.y)\n        });\n        shades.bottom.css({\n          top: px(c.y2),\n          left: px(c.x),\n          width: px(c.w),\n          height: px(boundy-c.y2)\n        });\n        shades.right.css({\n          left: px(c.x2),\n          width: px(boundx-c.x2)\n        });\n        shades.left.css({\n          width: px(c.x)\n        });\n      }\n      function createShade() {\n        return $('<div />').css({\n          position: 'absolute',\n          backgroundColor: options.shadeColor||options.bgColor\n        }).appendTo(holder);\n      }\n      function enableShade() {\n        if (!enabled) {\n          enabled = true;\n          holder.insertBefore($img);\n          updateAuto();\n          Selection.setBgOpacity(1,0,1);\n          $img2.hide();\n\n          setBgColor(options.shadeColor||options.bgColor,1);\n          if (Selection.isAwake())\n          {\n            setOpacity(options.bgOpacity,1);\n          }\n            else setOpacity(1,1);\n        }\n      }\n      function setBgColor(color,now) {\n        colorChangeMacro(getShades(),color,now);\n      }\n      function disableShade() {\n        if (enabled) {\n          holder.remove();\n          $img2.show();\n          enabled = false;\n          if (Selection.isAwake()) {\n            Selection.setBgOpacity(options.bgOpacity,1,1);\n          } else {\n            Selection.setBgOpacity(1,1,1);\n            Selection.disableHandles();\n          }\n          colorChangeMacro($div,0,1);\n        }\n      }\n      function setOpacity(opacity,now) {\n        if (enabled) {\n          if (options.bgFade && !now) {\n            holder.animate({\n              opacity: 1-opacity\n            },{\n              queue: false,\n              duration: options.fadeTime\n            });\n          }\n          else holder.css({opacity:1-opacity});\n        }\n      }\n      function refreshAll() {\n        options.shade ? enableShade() : disableShade();\n        if (Selection.isAwake()) setOpacity(options.bgOpacity);\n      }\n      function getShades() {\n        return holder.children();\n      }\n\n      return {\n        update: updateAuto,\n        updateRaw: updateShade,\n        getShades: getShades,\n        setBgColor: setBgColor,\n        enable: enableShade,\n        disable: disableShade,\n        resize: resizeShades,\n        refresh: refreshAll,\n        opacity: setOpacity\n      };\n    }());\n    // }}}\n    // Selection Module {{{\n    var Selection = (function () {\n      var awake,\n          hdep = 370,\n          borders = {},\n          handle = {},\n          dragbar = {},\n          seehandles = false;\n\n      // Private Methods\n      function insertBorder(type) //{{{\n      {\n        var jq = $('<div />').css({\n          position: 'absolute',\n          opacity: options.borderOpacity\n        }).addClass(cssClass(type));\n        $img_holder.append(jq);\n        return jq;\n      }\n      //}}}\n      function dragDiv(ord, zi) //{{{\n      {\n        var jq = $('<div />').mousedown(createDragger(ord)).css({\n          cursor: ord + '-resize',\n          position: 'absolute',\n          zIndex: zi\n        }).addClass('ord-'+ord);\n\n        if (Touch.support) {\n          jq.bind('touchstart.jcrop', Touch.createDragger(ord));\n        }\n\n        $hdl_holder.append(jq);\n        return jq;\n      }\n      //}}}\n      function insertHandle(ord) //{{{\n      {\n        var hs = options.handleSize;\n        return dragDiv(ord, hdep++).css({\n          opacity: options.handleOpacity\n        }).width(hs).height(hs).addClass(cssClass('handle'));\n      }\n      //}}}\n      function insertDragbar(ord) //{{{\n      {\n        return dragDiv(ord, hdep++).addClass('jcrop-dragbar');\n      }\n      //}}}\n      function createDragbars(li) //{{{\n      {\n        var i;\n        for (i = 0; i < li.length; i++) {\n          dragbar[li[i]] = insertDragbar(li[i]);\n        }\n      }\n      //}}}\n      function createBorders(li) //{{{\n      {\n        var cl,i;\n        for (i = 0; i < li.length; i++) {\n          switch(li[i]){\n            case'n': cl='hline'; break;\n            case's': cl='hline bottom'; break;\n            case'e': cl='vline right'; break;\n            case'w': cl='vline'; break;\n          }\n          borders[li[i]] = insertBorder(cl);\n        }\n      }\n      //}}}\n      function createHandles(li) //{{{\n      {\n        var i;\n        for (i = 0; i < li.length; i++) {\n          handle[li[i]] = insertHandle(li[i]);\n        }\n      }\n      //}}}\n      function moveto(x, y) //{{{\n      {\n        if (!options.shade) {\n          $img2.css({\n            top: px(-y),\n            left: px(-x)\n          });\n        }\n        $sel.css({\n          top: px(y),\n          left: px(x)\n        });\n      }\n      //}}}\n      function resize(w, h) //{{{\n      {\n        $sel.width(w).height(h);\n      }\n      //}}}\n      function refresh() //{{{\n      {\n        var c = Coords.getFixed();\n\n        Coords.setPressed([c.x, c.y]);\n        Coords.setCurrent([c.x2, c.y2]);\n\n        updateVisible();\n      }\n      //}}}\n\n      // Internal Methods\n      function updateVisible(select) //{{{\n      {\n        if (awake) {\n          return update(select);\n        }\n      }\n      //}}}\n      function update(select) //{{{\n      {\n        var c = Coords.getFixed();\n\n        resize(c.w, c.h);\n        moveto(c.x, c.y);\n        if (options.shade) Shade.updateRaw(c);\n\n        awake || show();\n\n        if (select) {\n          options.onSelect.call(api, unscale(c));\n        } else {\n          options.onChange.call(api, unscale(c));\n        }\n      }\n      //}}}\n      function setBgOpacity(opacity,force,now) //{{{\n      {\n        if (!awake && !force) return;\n        if (options.bgFade && !now) {\n          $img.animate({\n            opacity: opacity\n          },{\n            queue: false,\n            duration: options.fadeTime\n          });\n        } else {\n          $img.css('opacity', opacity);\n        }\n      }\n      //}}}\n      function show() //{{{\n      {\n        $sel.show();\n\n        if (options.shade) Shade.opacity(bgopacity);\n          else setBgOpacity(bgopacity,true);\n\n        awake = true;\n      }\n      //}}}\n      function release() //{{{\n      {\n        disableHandles();\n        $sel.hide();\n\n        if (options.shade) Shade.opacity(1);\n          else setBgOpacity(1);\n\n        awake = false;\n        options.onRelease.call(api);\n      }\n      //}}}\n      function showHandles() //{{{\n      {\n        if (seehandles) {\n          $hdl_holder.show();\n        }\n      }\n      //}}}\n      function enableHandles() //{{{\n      {\n        seehandles = true;\n        if (options.allowResize) {\n          $hdl_holder.show();\n          return true;\n        }\n      }\n      //}}}\n      function disableHandles() //{{{\n      {\n        seehandles = false;\n        $hdl_holder.hide();\n      } \n      //}}}\n      function animMode(v) //{{{\n      {\n        if (animating === v) {\n          disableHandles();\n        } else {\n          enableHandles();\n        }\n      } \n      //}}}\n      function done() //{{{\n      {\n        animMode(false);\n        refresh();\n      } \n      //}}}\n      // Insert draggable elements {{{\n      // Insert border divs for outline\n\n      if (options.dragEdges && $.isArray(options.createDragbars))\n        createDragbars(options.createDragbars);\n\n      if ($.isArray(options.createHandles))\n        createHandles(options.createHandles);\n\n      if (options.drawBorders && $.isArray(options.createBorders))\n        createBorders(options.createBorders);\n\n      //}}}\n\n      // This is a hack for iOS5 to support drag/move touch functionality\n      $(document).bind('touchstart.jcrop-ios',function(e) {\n        if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation();\n      });\n\n      var $track = newTracker().mousedown(createDragger('move')).css({\n        cursor: 'move',\n        position: 'absolute',\n        zIndex: 360\n      });\n\n      if (Touch.support) {\n        $track.bind('touchstart.jcrop', Touch.createDragger('move'));\n      }\n\n      $img_holder.append($track);\n      disableHandles();\n\n      return {\n        updateVisible: updateVisible,\n        update: update,\n        release: release,\n        refresh: refresh,\n        isAwake: function () {\n          return awake;\n        },\n        setCursor: function (cursor) {\n          $track.css('cursor', cursor);\n        },\n        enableHandles: enableHandles,\n        enableOnly: function () {\n          seehandles = true;\n        },\n        showHandles: showHandles,\n        disableHandles: disableHandles,\n        animMode: animMode,\n        setBgOpacity: setBgOpacity,\n        done: done\n      };\n    }());\n    \n    //}}}\n    // Tracker Module {{{\n    var Tracker = (function () {\n      var onMove = function () {},\n          onDone = function () {},\n          trackDoc = options.trackDocument;\n\n      function toFront() //{{{\n      {\n        $trk.css({\n          zIndex: 450\n        });\n        if (Touch.support) {\n          $(document)\n            .bind('touchmove.jcrop', trackTouchMove)\n            .bind('touchend.jcrop', trackTouchEnd);\n        }\n        if (trackDoc) {\n          $(document)\n            .bind('mousemove.jcrop',trackMove)\n            .bind('mouseup.jcrop',trackUp);\n        }\n      } \n      //}}}\n      function toBack() //{{{\n      {\n        $trk.css({\n          zIndex: 290\n        });\n        $(document).unbind('.jcrop');\n      } \n      //}}}\n      function trackMove(e) //{{{\n      {\n        onMove(mouseAbs(e));\n        return false;\n      } \n      //}}}\n      function trackUp(e) //{{{\n      {\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (btndown) {\n          btndown = false;\n\n          onDone(mouseAbs(e));\n\n          if (Selection.isAwake()) {\n            options.onSelect.call(api, unscale(Coords.getFixed()));\n          }\n\n          toBack();\n          onMove = function () {};\n          onDone = function () {};\n        }\n\n        return false;\n      }\n      //}}}\n      function activateHandlers(move, done) //{{{\n      {\n        btndown = true;\n        onMove = move;\n        onDone = done;\n        toFront();\n        return false;\n      }\n      //}}}\n      function trackTouchMove(e) //{{{\n      {\n        e.pageX = e.originalEvent.changedTouches[0].pageX;\n        e.pageY = e.originalEvent.changedTouches[0].pageY;\n        return trackMove(e);\n      }\n      //}}}\n      function trackTouchEnd(e) //{{{\n      {\n        e.pageX = e.originalEvent.changedTouches[0].pageX;\n        e.pageY = e.originalEvent.changedTouches[0].pageY;\n        return trackUp(e);\n      }\n      //}}}\n      function setCursor(t) //{{{\n      {\n        $trk.css('cursor', t);\n      }\n      //}}}\n\n      if (!trackDoc) {\n        $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);\n      }\n\n      $img.before($trk);\n      return {\n        activateHandlers: activateHandlers,\n        setCursor: setCursor\n      };\n    }());\n    //}}}\n    // KeyManager Module {{{\n    var KeyManager = (function () {\n      var $keymgr = $('<input type=\"radio\" />').css({\n        position: 'fixed',\n        left: '-120px',\n        width: '12px'\n      }),\n          $keywrap = $('<div />').css({\n          position: 'absolute',\n          overflow: 'hidden'\n        }).append($keymgr);\n\n      function watchKeys() //{{{\n      {\n        if (options.keySupport) {\n          $keymgr.show();\n          $keymgr.focus();\n        }\n      }\n      //}}}\n      function onBlur(e) //{{{\n      {\n        $keymgr.hide();\n      }\n      //}}}\n      function doNudge(e, x, y) //{{{\n      {\n        if (options.allowMove) {\n          Coords.moveOffset([x, y]);\n          Selection.updateVisible(true);\n        }\n        e.preventDefault();\n        e.stopPropagation();\n      }\n      //}}}\n      function parseKey(e) //{{{\n      {\n        if (e.ctrlKey || e.metaKey) {\n          return true;\n        }\n        shift_down = e.shiftKey ? true : false;\n        var nudge = shift_down ? 10 : 1;\n\n        switch (e.keyCode) {\n        case 37:\n          doNudge(e, -nudge, 0);\n          break;\n        case 39:\n          doNudge(e, nudge, 0);\n          break;\n        case 38:\n          doNudge(e, 0, -nudge);\n          break;\n        case 40:\n          doNudge(e, 0, nudge);\n          break;\n        case 27:\n          if (options.allowSelect) Selection.release();\n          break;\n        case 9:\n          return true;\n        }\n\n        return false;\n      }\n      //}}}\n\n      if (options.keySupport) {\n        $keymgr.keydown(parseKey).blur(onBlur);\n        if (ie6mode || !options.fixedSupport) {\n          $keymgr.css({\n            position: 'absolute',\n            left: '-20px'\n          });\n          $keywrap.append($keymgr).insertBefore($img);\n        } else {\n          $keymgr.insertBefore($img);\n        }\n      }\n\n\n      return {\n        watchKeys: watchKeys\n      };\n    }());\n    //}}}\n    // }}}\n    // API methods {{{\n    function setClass(cname) //{{{\n    {\n      $div.removeClass().addClass(cssClass('holder')).addClass(cname);\n    }\n    //}}}\n    function animateTo(a, callback) //{{{\n    {\n      var x1 = a[0] / xscale,\n          y1 = a[1] / yscale,\n          x2 = a[2] / xscale,\n          y2 = a[3] / yscale;\n\n      if (animating) {\n        return;\n      }\n\n      var animto = Coords.flipCoords(x1, y1, x2, y2),\n          c = Coords.getFixed(),\n          initcr = [c.x, c.y, c.x2, c.y2],\n          animat = initcr,\n          interv = options.animationDelay,\n          ix1 = animto[0] - initcr[0],\n          iy1 = animto[1] - initcr[1],\n          ix2 = animto[2] - initcr[2],\n          iy2 = animto[3] - initcr[3],\n          pcent = 0,\n          velocity = options.swingSpeed;\n\n      x = animat[0];\n      y = animat[1];\n      x2 = animat[2];\n      y2 = animat[3];\n\n      Selection.animMode(true);\n      var anim_timer;\n\n      function queueAnimator() {\n        window.setTimeout(animator, interv);\n      }\n      var animator = (function () {\n        return function () {\n          pcent += (100 - pcent) / velocity;\n\n          animat[0] = x + ((pcent / 100) * ix1);\n          animat[1] = y + ((pcent / 100) * iy1);\n          animat[2] = x2 + ((pcent / 100) * ix2);\n          animat[3] = y2 + ((pcent / 100) * iy2);\n\n          if (pcent >= 99.8) {\n            pcent = 100;\n          }\n          if (pcent < 100) {\n            setSelectRaw(animat);\n            queueAnimator();\n          } else {\n            Selection.done();\n            if (typeof(callback) === 'function') {\n              callback.call(api);\n            }\n          }\n        };\n      }());\n      queueAnimator();\n    }\n    //}}}\n    function setSelect(rect) //{{{\n    {\n      setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale]);\n      options.onSelect.call(api, unscale(Coords.getFixed()));\n      Selection.enableHandles();\n    }\n    //}}}\n    function setSelectRaw(l) //{{{\n    {\n      Coords.setPressed([l[0], l[1]]);\n      Coords.setCurrent([l[2], l[3]]);\n      Selection.update();\n    }\n    //}}}\n    function tellSelect() //{{{\n    {\n      return unscale(Coords.getFixed());\n    }\n    //}}}\n    function tellScaled() //{{{\n    {\n      return Coords.getFixed();\n    }\n    //}}}\n    function setOptionsNew(opt) //{{{\n    {\n      setOptions(opt);\n      interfaceUpdate();\n    }\n    //}}}\n    function disableCrop() //{{{\n    {\n      options.disabled = true;\n      Selection.disableHandles();\n      Selection.setCursor('default');\n      Tracker.setCursor('default');\n    }\n    //}}}\n    function enableCrop() //{{{\n    {\n      options.disabled = false;\n      interfaceUpdate();\n    }\n    //}}}\n    function cancelCrop() //{{{\n    {\n      Selection.done();\n      Tracker.activateHandlers(null, null);\n    }\n    //}}}\n    function destroy() //{{{\n    {\n      $div.remove();\n      $origimg.show();\n      $(obj).removeData('Jcrop');\n    }\n    //}}}\n    function setImage(src, callback) //{{{\n    {\n      Selection.release();\n      disableCrop();\n      var img = new Image();\n      img.onload = function () {\n        var iw = img.width;\n        var ih = img.height;\n        var bw = options.boxWidth;\n        var bh = options.boxHeight;\n        $img.width(iw).height(ih);\n        $img.attr('src', src);\n        $img2.attr('src', src);\n        presize($img, bw, bh);\n        boundx = $img.width();\n        boundy = $img.height();\n        $img2.width(boundx).height(boundy);\n        $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2));\n        $div.width(boundx).height(boundy);\n        Shade.resize(boundx,boundy);\n        enableCrop();\n\n        if (typeof(callback) === 'function') {\n          callback.call(api);\n        }\n      };\n      img.src = src;\n    }\n    //}}}\n    function colorChangeMacro($obj,color,now) {\n      var mycolor = color || options.bgColor;\n      if (options.bgFade && supportsColorFade() && options.fadeTime && !now) {\n        $obj.animate({\n          backgroundColor: mycolor\n        }, {\n          queue: false,\n          duration: options.fadeTime\n        });\n      } else {\n        $obj.css('backgroundColor', mycolor);\n      }\n    }\n    function interfaceUpdate(alt) //{{{\n    // This method tweaks the interface based on options object.\n    // Called when options are changed and at end of initialization.\n    {\n      if (options.allowResize) {\n        if (alt) {\n          Selection.enableOnly();\n        } else {\n          Selection.enableHandles();\n        }\n      } else {\n        Selection.disableHandles();\n      }\n\n      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');\n      Selection.setCursor(options.allowMove ? 'move' : 'default');\n\n      if (options.hasOwnProperty('trueSize')) {\n        xscale = options.trueSize[0] / boundx;\n        yscale = options.trueSize[1] / boundy;\n      }\n\n      if (options.hasOwnProperty('setSelect')) {\n        setSelect(options.setSelect);\n        Selection.done();\n        delete(options.setSelect);\n      }\n\n      Shade.refresh();\n\n      if (options.bgColor != bgcolor) {\n        colorChangeMacro(\n          options.shade? Shade.getShades(): $div,\n          options.shade?\n            (options.shadeColor || options.bgColor):\n            options.bgColor\n        );\n        bgcolor = options.bgColor;\n      }\n\n      if (bgopacity != options.bgOpacity) {\n        bgopacity = options.bgOpacity;\n        if (options.shade) Shade.refresh();\n          else Selection.setBgOpacity(bgopacity);\n      }\n\n      xlimit = options.maxSize[0] || 0;\n      ylimit = options.maxSize[1] || 0;\n      xmin = options.minSize[0] || 0;\n      ymin = options.minSize[1] || 0;\n\n      if (options.hasOwnProperty('outerImage')) {\n        $img.attr('src', options.outerImage);\n        delete(options.outerImage);\n      }\n\n      Selection.refresh();\n    }\n    //}}}\n    //}}}\n\n    if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection);\n\n    $hdl_holder.hide();\n    interfaceUpdate(true);\n\n    var api = {\n      setImage: setImage,\n      animateTo: animateTo,\n      setSelect: setSelect,\n      setOptions: setOptionsNew,\n      tellSelect: tellSelect,\n      tellScaled: tellScaled,\n      setClass: setClass,\n\n      disable: disableCrop,\n      enable: enableCrop,\n      cancel: cancelCrop,\n      release: Selection.release,\n      destroy: destroy,\n\n      focus: KeyManager.watchKeys,\n\n      getBounds: function () {\n        return [boundx * xscale, boundy * yscale];\n      },\n      getWidgetSize: function () {\n        return [boundx, boundy];\n      },\n      getScaleFactor: function () {\n        return [xscale, yscale];\n      },\n      getOptions: function() {\n        // careful: internal values are returned\n        return options;\n      },\n\n      ui: {\n        holder: $div,\n        selection: $sel\n      }\n    };\n\n    if ($.browser.msie)\n      $div.bind('selectstart', function () { return false; });\n\n    $origimg.data('Jcrop', api);\n    return api;\n  };\n  $.fn.Jcrop = function (options, callback) //{{{\n  {\n    var api;\n    // Iterate over each object, attach Jcrop\n    this.each(function () {\n      // If we've already attached to this object\n      if ($(this).data('Jcrop')) {\n        // The API can be requested this way (undocumented)\n        if (options === 'api') return $(this).data('Jcrop');\n        // Otherwise, we just reset the options...\n        else $(this).data('Jcrop').setOptions(options);\n      }\n      // If we haven't been attached, preload and attach\n      else {\n        if (this.tagName == 'IMG')\n          $.Jcrop.Loader(this,function(){\n            $(this).css({display:'block',visibility:'hidden'});\n            api = $.Jcrop(this, options);\n            if ($.isFunction(callback)) callback.call(api);\n          });\n        else {\n          $(this).css({display:'block',visibility:'hidden'});\n          api = $.Jcrop(this, options);\n          if ($.isFunction(callback)) callback.call(api);\n        }\n      }\n    });\n\n    // Return \"this\" so the object is chainable (jQuery-style)\n    return this;\n  };\n  //}}}\n  // $.Jcrop.Loader - basic image loader {{{\n\n  $.Jcrop.Loader = function(imgobj,success,error){\n    var $img = $(imgobj), img = $img[0];\n\n    function completeCheck(){\n      if (img.complete) {\n        $img.unbind('.jcloader');\n        if ($.isFunction(success)) success.call(img);\n      }\n      else window.setTimeout(completeCheck,50);\n    }\n\n    $img\n      .bind('load.jcloader',completeCheck)\n      .bind('error.jcloader',function(e){\n        $img.unbind('.jcloader');\n        if ($.isFunction(error)) error.call(img);\n      });\n\n    if (img.complete && $.isFunction(success)){\n      $img.unbind('.jcloader');\n      success.call(img);\n    }\n  };\n\n  //}}}\n  // Global Defaults {{{\n  $.Jcrop.defaults = {\n\n    // Basic Settings\n    allowSelect: true,\n    allowMove: true,\n    allowResize: true,\n\n    trackDocument: true,\n\n    // Styling Options\n    baseClass: 'jcrop',\n    addClass: null,\n    bgColor: 'black',\n    bgOpacity: 0.6,\n    bgFade: false,\n    borderOpacity: 0.4,\n    handleOpacity: 0.5,\n    handleSize: 7,\n\n    aspectRatio: 0,\n    keySupport: true,\n    createHandles: ['n','s','e','w','nw','ne','se','sw'],\n    createDragbars: ['n','s','e','w'],\n    createBorders: ['n','s','e','w'],\n    drawBorders: true,\n    dragEdges: true,\n    fixedSupport: true,\n    touchSupport: null,\n\n    shade: null,\n\n    boxWidth: 0,\n    boxHeight: 0,\n    boundary: 2,\n    fadeTime: 400,\n    animationDelay: 20,\n    swingSpeed: 3,\n\n    minSelect: [0, 0],\n    maxSize: [0, 0],\n    minSize: [0, 0],\n\n    // Callbacks / Event Handlers\n    onChange: function () {},\n    onSelect: function () {},\n    onDblClick: function () {},\n    onRelease: function () {}\n  };\n\n  // }}}\n}(jQuery));\n"
  },
  {
    "path": "set/Jcrop/js/jquery.color.js",
    "content": "/*\n * jQuery Color Animations\n * Copyright 2007 John Resig\n * Released under the MIT and GPL licenses.\n */\n\n(function(jQuery){\n\n\t// We override the animation for all of these color styles\n\tjQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){\n\t\tjQuery.fx.step[attr] = function(fx){\n\t\t\tif ( fx.state == 0 ) {\n\t\t\t\tfx.start = getColor( fx.elem, attr );\n\t\t\t\tfx.end = getRGB( fx.end );\n\t\t\t}\n\n\t\t\tfx.elem.style[attr] = \"rgb(\" + [\n\t\t\t\tMath.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),\n\t\t\t\tMath.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),\n\t\t\t\tMath.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)\n\t\t\t].join(\",\") + \")\";\n\t\t}\n\t});\n\n\t// Color Conversion functions from highlightFade\n\t// By Blair Mitchelmore\n\t// http://jquery.offput.ca/highlightFade/\n\n\t// Parse strings looking for color tuples [255,255,255]\n\tfunction getRGB(color) {\n\t\tvar result;\n\n\t\t// Check if we're already dealing with an array of colors\n\t\tif ( color && color.constructor == Array && color.length == 3 )\n\t\t\treturn color;\n\n\t\t// Look for rgb(num,num,num)\n\t\tif (result = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(color))\n\t\t\treturn [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];\n\n\t\t// Look for rgb(num%,num%,num%)\n\t\tif (result = /rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(color))\n\t\t\treturn [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];\n\n\t\t// Look for #a0b1c2\n\t\tif (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))\n\t\t\treturn [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];\n\n\t\t// Look for #fff\n\t\tif (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))\n\t\t\treturn [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];\n\n\t\t// Otherwise, we're most likely dealing with a named color\n\t\treturn colors[jQuery.trim(color).toLowerCase()];\n\t}\n\t\n\tfunction getColor(elem, attr) {\n\t\tvar color;\n\n\t\tdo {\n\t\t\tcolor = jQuery.curCSS(elem, attr);\n\n\t\t\t// Keep going until we find an element that has color, or we hit the body\n\t\t\tif ( color != '' && color != 'transparent' || jQuery.nodeName(elem, \"body\") )\n\t\t\t\tbreak; \n\n\t\t\tattr = \"backgroundColor\";\n\t\t} while ( elem = elem.parentNode );\n\n\t\treturn getRGB(color);\n\t};\n\t\n\t// Some named colors to work with\n\t// From Interface by Stefan Petre\n\t// http://interface.eyecon.ro/\n\n\tvar colors = {\n\t\taqua:[0,255,255],\n\t\tazure:[240,255,255],\n\t\tbeige:[245,245,220],\n\t\tblack:[0,0,0],\n\t\tblue:[0,0,255],\n\t\tbrown:[165,42,42],\n\t\tcyan:[0,255,255],\n\t\tdarkblue:[0,0,139],\n\t\tdarkcyan:[0,139,139],\n\t\tdarkgrey:[169,169,169],\n\t\tdarkgreen:[0,100,0],\n\t\tdarkkhaki:[189,183,107],\n\t\tdarkmagenta:[139,0,139],\n\t\tdarkolivegreen:[85,107,47],\n\t\tdarkorange:[255,140,0],\n\t\tdarkorchid:[153,50,204],\n\t\tdarkred:[139,0,0],\n\t\tdarksalmon:[233,150,122],\n\t\tdarkviolet:[148,0,211],\n\t\tfuchsia:[255,0,255],\n\t\tgold:[255,215,0],\n\t\tgreen:[0,128,0],\n\t\tindigo:[75,0,130],\n\t\tkhaki:[240,230,140],\n\t\tlightblue:[173,216,230],\n\t\tlightcyan:[224,255,255],\n\t\tlightgreen:[144,238,144],\n\t\tlightgrey:[211,211,211],\n\t\tlightpink:[255,182,193],\n\t\tlightyellow:[255,255,224],\n\t\tlime:[0,255,0],\n\t\tmagenta:[255,0,255],\n\t\tmaroon:[128,0,0],\n\t\tnavy:[0,0,128],\n\t\tolive:[128,128,0],\n\t\torange:[255,165,0],\n\t\tpink:[255,192,203],\n\t\tpurple:[128,0,128],\n\t\tviolet:[128,0,128],\n\t\tred:[255,0,0],\n\t\tsilver:[192,192,192],\n\t\twhite:[255,255,255],\n\t\tyellow:[255,255,0]\n\t};\n\t\n})(jQuery);\n"
  },
  {
    "path": "set/avatar.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <title></title>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/avatar.css\" media=\"all\">\r\n    <style type=\"text/css\">\r\n\r\n        body{background: #fafafa;}\r\n        button{clear: both;display: block;padding:5px 15px;}\r\n    </style>\r\n</head>\r\n<body>\r\n<div class=\"avatarbox\">\r\n    <div class=\"imgproview_b\">\r\n        <div class=\"imgcenter\">\r\n            <input style=\"display: none\" type=\"file\" name=\"\" id=\"uploadpic\">\r\n        </div>\r\n    </div>\r\n    <div class=\"imgproview\">\r\n        <div class=\"imgbox_b\"><div></div><span>中尺寸头像50×50像素</span></div>\r\n        <div class=\"imgbox_s\"><div></div><span>小尺寸头像30×30像素</span></div>\r\n    </div>\r\n    <button>保存头像</button>\r\n</div>\r\n<script type=\"text/javascript\" src=\"js/jQuery-1.7.1.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"uploadify/jquery.uploadify-3.1.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"js/jquery.Jcrop.js\"></script>\r\n<script type=\"text/javascript\">\r\n    $(function($){\r\n        $(\"#uploadpic\").uploadify({\r\n            auto:true,\r\n            height: 36,\r\n            swf: 'uploadify/uploadify.swf',\r\n            uploader: 'avatar.html',\r\n            width: 101,\r\n            buttonText:\"\",\r\n            onUploadStart:function(file){\r\n                $(\".imgcenter\").html(\"\").addClass(\"uploading\");\r\n            },\r\n            onUploadSuccess:function(file, data, response){\r\n                userAvatar(data);//返回的data值为图片的地址\r\n            },\r\n            onUploadError:function(data){\r\n\r\n            }\r\n        });\r\n        function userAvatar(picUrl){\r\n            $(\".imgcenter\").html(\"<img src=\"+picUrl+\" id='target' alt='Flowers' />\").addClass(\"uploadcomplete\");\r\n            $(\".imgbox_b div\").append(\"<img src=\"+picUrl+\" id='preview_b' alt='Preview' class='jcrop-preview' />\");\r\n            $(\".imgbox_s div\").append(\"<img src=\"+picUrl+\" id='preview_s' alt='Preview' class='jcrop-preview' />\");\r\n            $(\".imgproview\").append('<div class=\"imgbox_s\"><a href=\"javacript:;\">重新上传</a></div>');\r\n            var jcrop_api, boundx, boundy;\r\n            $('#target').Jcrop({onChange: updatePreview,onSelect: updatePreview,bgOpacity:   .8,aspectRatio: 1},function(){\r\n                var bounds = this.getBounds();boundx = bounds[0];boundy = bounds[1];jcrop_api = this;});\r\n            function updatePreview(c){\r\n                if (parseInt(c.w) > 0){\r\n                    var rxb = 50 / c.w,ryb = 50 / c.h,rxs = 30 / c.w,rys = 30 / c.h;\r\n                    $('#preview_b').css({width: Math.round(rxb * boundx) + 'px',height: Math.round(ryb * boundy) + 'px',marginLeft: '-' + Math.round(rxb * c.x) + 'px', marginTop: '-' + Math.round(ryb * c.y) + 'px'});\r\n                    $('#preview_s').css({width: Math.round(rxs * boundx) + 'px',height: Math.round(rys * boundy) + 'px',marginLeft: '-' + Math.round(rxs * c.x) + 'px',marginTop: '-' + Math.round(rys * c.y) + 'px'});\r\n                }\r\n            };\r\n        }\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "set/css/avatar.css",
    "content": "*{padding:0;margin:0;}\nimg{border:none;}\n.jcrop-holder {direction: ltr;text-align: left;}\n.jcrop-vline,.jcrop-hline{background:#FFF url(../img/Jcrop.gif) top left repeat;font-size:0;position:absolute;}\n.jcrop-vline{height:100%;width:1px!important;}\n.jcrop-hline{height:1px!important;width:100%;}\n.jcrop-vline.right{right:0;}\n.jcrop-hline.bottom{bottom:0;}\n.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}\n.jcrop-tracker{height: 100%; width: 100%;-webkit-tap-highlight-color: transparent;-webkit-touch-callout: none; -webkit-user-select: none;}\n.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}\n.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}\n.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}\n.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}\n.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}\n.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}\n.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}\n.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}\n.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}\n.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}\n.jcrop-dragbar.ord-n{margin-top:-4px;}\n.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}\n.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}\n.jcrop-dragbar.ord-w{margin-left:-4px;}\n.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline{background:#FFF;filter:Alpha(opacity=70)!important;opacity:.70!important;}\n.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#FFF;border-radius:3px;}\n.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline{background:#000;filter:Alpha(opacity=70)!important;opacity:.7!important;}\n.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#FFF;border-color:#000;\tborder-radius:3px;}\n.jcrop-holder img,img.jcrop-preview{ max-width: none; }\n\n.avatarbox{background: #fff;width: 352px; height:280px;}\n.avatarbox .imgcenter{background: url(../img/avatar_bg.png) no-repeat;border:solid 1px #eee;width:280px;height:280px;overflow: hidden;display:table-cell;text-align:center;vertical-align:middle;*display:block;font-size:280px;+font-size:270px; }\n.avatarbox .uploading{background:#fafafa url(../img/loading.gif) no-repeat center center;}\n.avatarbox .uploadcomplete{background: #fff;}\n.avatarbox .imgcenter img{display:block;max-height: 280px;max-width: 280px;vertical-align: middle;}\n.avatarbox .imgproview_b{float: left;}\n.avatarbox .imgproview{float: left;margin-left:10px;width: 60px;}\n.avatarbox .imgproview a{font-size: 12px;display: block;color:#666;display: block;width:60px;height: 21px;background: url(\"../img/favc_btn.png\") no-repeat; text-align: center;line-height: 21px; text-decoration: none;}\n.avatarbox .imgproview a:hover{background-position: 0 bottom;color:#333;}\n.avatarbox .imgbox_b{height:100px; text-align: center}\n.avatarbox .imgbox_b div{width:50px;height:50px;overflow:hidden;margin:0 auto;background: #fafafa;}\n.avatarbox .imgbox_s{height:86px; text-align: center}\n.avatarbox .imgbox_s div{width:30px;height:30px;overflow:hidden;margin:0 auto;background: #fafafa;}\n.avatarbox .imgproview span{color:#999;font-size: 12px;line-height:1.2;display:block;margin:5px 0;}\n\n#uploadpic{margin:120px auto 0 auto;+margin-top:-26px;_margin-top:180px;}\n.avatarbox .imgcenter .uploadify-error {background-color: #FDE5DD !important;font-size:12px;}\n.avatarbox .imgcenter .uploadify-error a{display: none;}\n.uploadify {position: relative;margin-bottom: 1em;}\n.swfupload{background:transparent;_margin:0 0 0 -50px;}\n.uploadify-button {background: url(../img/upload_btn.png) no-repeat;width: 100%;}\n.uploadify:hover .uploadify-button {background-position:0 -36px;}\n.uploadify-error {background-color: #FDE5DD !important;font-size:12px !important;}\n.uploadify-error a{display: none;}\n.uploadify-progress {background-color: #E5E5E5;margin-top: 10px;width: 100%;}\n.uploadify-progress-bar {background-color: #0099FF;height: 3px;\twidth: 1px;}"
  },
  {
    "path": "set/js/jquery.Jcrop.js",
    "content": "/**\n * jquery.Jcrop.js v0.9.10\n * jQuery Image Cropping Plugin - released under MIT License \n * Author: Kelly Hallman <khallman@gmail.com>\n * http://github.com/tapmodo/Jcrop\n * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * }}}\n */\n\n(function ($) {\n\n  $.Jcrop = function (obj, opt) {\n    var options = $.extend({}, $.Jcrop.defaults),\n        docOffset, lastcurs, ie6mode = false;\n\n    // Internal Methods {{{\n    function px(n) {\n      return n + 'px';\n    }\n    function cssClass(cl) {\n      return options.baseClass + '-' + cl;\n    }\n    function supportsColorFade() {\n      return $.fx.step.hasOwnProperty('backgroundColor');\n    }\n    function getPos(obj) //{{{\n    {\n      var pos = $(obj).offset();\n      return [pos.left, pos.top];\n    }\n    //}}}\n    function mouseAbs(e) //{{{\n    {\n      return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])];\n    }\n    //}}}\n    function setOptions(opt) //{{{\n    {\n      if (typeof(opt) !== 'object') opt = {};\n      options = $.extend(options, opt);\n\n      $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) {\n        if (typeof(options[e]) !== 'function') options[e] = function () {};\n      });\n    }\n    //}}}\n    function startDragMode(mode, pos) //{{{\n    {\n      docOffset = getPos($img);\n      Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');\n\n      if (mode === 'move') {\n        return Tracker.activateHandlers(createMover(pos), doneSelect);\n      }\n\n      var fc = Coords.getFixed();\n      var opp = oppLockCorner(mode);\n      var opc = Coords.getCorner(oppLockCorner(opp));\n\n      Coords.setPressed(Coords.getCorner(opp));\n      Coords.setCurrent(opc);\n\n      Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);\n    }\n    //}}}\n    function dragmodeHandler(mode, f) //{{{\n    {\n      return function (pos) {\n        if (!options.aspectRatio) {\n          switch (mode) {\n          case 'e':\n            pos[1] = f.y2;\n            break;\n          case 'w':\n            pos[1] = f.y2;\n            break;\n          case 'n':\n            pos[0] = f.x2;\n            break;\n          case 's':\n            pos[0] = f.x2;\n            break;\n          }\n        } else {\n          switch (mode) {\n          case 'e':\n            pos[1] = f.y + 1;\n            break;\n          case 'w':\n            pos[1] = f.y + 1;\n            break;\n          case 'n':\n            pos[0] = f.x + 1;\n            break;\n          case 's':\n            pos[0] = f.x + 1;\n            break;\n          }\n        }\n        Coords.setCurrent(pos);\n        Selection.update();\n      };\n    }\n    //}}}\n    function createMover(pos) //{{{\n    {\n      var lloc = pos;\n      KeyManager.watchKeys();\n\n      return function (pos) {\n        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);\n        lloc = pos;\n\n        Selection.update();\n      };\n    }\n    //}}}\n    function oppLockCorner(ord) //{{{\n    {\n      switch (ord) {\n      case 'n':\n        return 'sw';\n      case 's':\n        return 'nw';\n      case 'e':\n        return 'nw';\n      case 'w':\n        return 'ne';\n      case 'ne':\n        return 'sw';\n      case 'nw':\n        return 'se';\n      case 'se':\n        return 'nw';\n      case 'sw':\n        return 'ne';\n      }\n    }\n    //}}}\n    function createDragger(ord) //{{{\n    {\n      return function (e) {\n        if (options.disabled) {\n          return false;\n        }\n        if ((ord === 'move') && !options.allowMove) {\n          return false;\n        }\n        \n        // Fix position of crop area when dragged the very first time.\n        // Necessary when crop image is in a hidden element when page is loaded.\n        docOffset = getPos($img);\n\n        btndown = true;\n        startDragMode(ord, mouseAbs(e));\n        e.stopPropagation();\n        e.preventDefault();\n        return false;\n      };\n    }\n    //}}}\n    function presize($obj, w, h) //{{{\n    {\n      var nw = $obj.width(),\n          nh = $obj.height();\n      if ((nw > w) && w > 0) {\n        nw = w;\n        nh = (w / $obj.width()) * $obj.height();\n      }\n      if ((nh > h) && h > 0) {\n        nh = h;\n        nw = (h / $obj.height()) * $obj.width();\n      }\n      xscale = $obj.width() / nw;\n      yscale = $obj.height() / nh;\n      $obj.width(nw).height(nh);\n    }\n    //}}}\n    function unscale(c) //{{{\n    {\n      return {\n        x: c.x * xscale,\n        y: c.y * yscale,\n        x2: c.x2 * xscale,\n        y2: c.y2 * yscale,\n        w: c.w * xscale,\n        h: c.h * yscale\n      };\n    }\n    //}}}\n    function doneSelect(pos) //{{{\n    {\n      var c = Coords.getFixed();\n      if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) {\n        Selection.enableHandles();\n        Selection.done();\n      } else {\n        Selection.release();\n      }\n      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');\n    }\n    //}}}\n    function newSelection(e) //{{{\n    {\n      if (options.disabled) {\n        return false;\n      }\n      if (!options.allowSelect) {\n        return false;\n      }\n      btndown = true;\n      docOffset = getPos($img);\n      Selection.disableHandles();\n      Tracker.setCursor('crosshair');\n      var pos = mouseAbs(e);\n      Coords.setPressed(pos);\n      Selection.update();\n      Tracker.activateHandlers(selectDrag, doneSelect);\n      KeyManager.watchKeys();\n\n      e.stopPropagation();\n      e.preventDefault();\n      return false;\n    }\n    //}}}\n    function selectDrag(pos) //{{{\n    {\n      Coords.setCurrent(pos);\n      Selection.update();\n    }\n    //}}}\n    function newTracker() //{{{\n    {\n      var trk = $('<div></div>').addClass(cssClass('tracker'));\n      if ($.browser.msie) {\n        trk.css({\n          opacity: 0,\n          backgroundColor: 'white'\n        });\n      }\n      return trk;\n    }\n    //}}}\n\n    // }}}\n    // Initialization {{{\n    // Sanitize some options {{{\n    if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) {\n      ie6mode = true;\n    }\n    if (typeof(obj) !== 'object') {\n      obj = $(obj)[0];\n    }\n    if (typeof(opt) !== 'object') {\n      opt = {};\n    }\n    // }}}\n    setOptions(opt);\n    // Initialize some jQuery objects {{{\n    // The values are SET on the image(s) for the interface\n    // If the original image has any of these set, they will be reset\n    // However, if you destroy() the Jcrop instance the original image's\n    // character in the DOM will be as you left it.\n    var img_css = {\n      border: 'none',\n      visibility: 'visible',\n      margin: 0,\n      padding: 0,\n      position: 'absolute',\n      top: 0,\n      left: 0\n    };\n\n    var $origimg = $(obj),\n      img_mode = true;\n\n    if (obj.tagName == 'IMG') {\n      // Fix size of crop image.\n      // Necessary when crop image is within a hidden element when page is loaded.\n      if ($origimg[0].width != 0 && $origimg[0].height != 0) {\n        // Obtain dimensions from contained img element.\n        $origimg.width($origimg[0].width);\n        $origimg.height($origimg[0].height);\n      } else {\n        // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). \n        var tempImage = new Image();\n        tempImage.src = $origimg[0].src;\n        $origimg.width(tempImage.width);\n        $origimg.height(tempImage.height);\n      } \n\n      var $img = $origimg.clone().removeAttr('id').css(img_css).show();\n\n      $img.width($origimg.width());\n      $img.height($origimg.height());\n      $origimg.after($img).hide();\n\n    } else {\n      $img = $origimg.css(img_css).show();\n      img_mode = false;\n      if (options.shade === null) { options.shade = true; }\n    }\n\n    presize($img, options.boxWidth, options.boxHeight);\n\n    var boundx = $img.width(),\n        boundy = $img.height(),\n        \n        \n        $div = $('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({\n        position: 'relative',\n        backgroundColor: options.bgColor\n      }).insertAfter($origimg).append($img);\n\n    if (options.addClass) {\n      $div.addClass(options.addClass);\n    }\n\n    var $img2 = $('<div />'),\n\n        $img_holder = $('<div />') \n        .width('100%').height('100%').css({\n          zIndex: 310,\n          position: 'absolute',\n          overflow: 'hidden'\n        }),\n\n        $hdl_holder = $('<div />') \n        .width('100%').height('100%').css('zIndex', 320), \n\n        $sel = $('<div />') \n        .css({\n          position: 'absolute',\n          zIndex: 600\n        }).dblclick(function(){\n          var c = Coords.getFixed();\n          options.onDblClick.call(api,c);\n        }).insertBefore($img).append($img_holder, $hdl_holder); \n\n    if (img_mode) {\n\n      $img2 = $('<img />')\n          .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy),\n\n      $img_holder.append($img2);\n\n    }\n\n    if (ie6mode) {\n      $sel.css({\n        overflowY: 'hidden'\n      });\n    }\n\n    var bound = options.boundary;\n    var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({\n      position: 'absolute',\n      top: px(-bound),\n      left: px(-bound),\n      zIndex: 290\n    }).mousedown(newSelection);\n\n    /* }}} */\n    // Set more variables {{{\n    var bgcolor = options.bgColor,\n        bgopacity = options.bgOpacity,\n        xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true,\n        btndown, animating, shift_down;\n\n    docOffset = getPos($img);\n    // }}}\n    // }}}\n    // Internal Modules {{{\n    // Touch Module {{{ \n    var Touch = (function () {\n      // Touch support detection function adapted (under MIT License)\n      // from code by Jeffrey Sambells - http://github.com/iamamused/\n      function hasTouchSupport() {\n        var support = {},\n            events = ['touchstart', 'touchmove', 'touchend'],\n            el = document.createElement('div'), i;\n\n        try {\n          for(i=0; i<events.length; i++) {\n            var eventName = events[i];\n            eventName = 'on' + eventName;\n            var isSupported = (eventName in el);\n            if (!isSupported) {\n              el.setAttribute(eventName, 'return;');\n              isSupported = typeof el[eventName] == 'function';\n            }\n            support[events[i]] = isSupported;\n          }\n          return support.touchstart && support.touchend && support.touchmove;\n        }\n        catch(err) {\n          return false;\n        }\n      }\n\n      function detectSupport() {\n        if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;\n          else return hasTouchSupport();\n      }\n      return {\n        createDragger: function (ord) {\n          return function (e) {\n            e.pageX = e.originalEvent.changedTouches[0].pageX;\n            e.pageY = e.originalEvent.changedTouches[0].pageY;\n            if (options.disabled) {\n              return false;\n            }\n            if ((ord === 'move') && !options.allowMove) {\n              return false;\n            }\n            btndown = true;\n            startDragMode(ord, mouseAbs(e));\n            e.stopPropagation();\n            e.preventDefault();\n            return false;\n          };\n        },\n        newSelection: function (e) {\n          e.pageX = e.originalEvent.changedTouches[0].pageX;\n          e.pageY = e.originalEvent.changedTouches[0].pageY;\n          return newSelection(e);\n        },\n        isSupported: hasTouchSupport,\n        support: detectSupport()\n      };\n    }());\n    // }}}\n    // Coords Module {{{\n    var Coords = (function () {\n      var x1 = 0,\n          y1 = 0,\n          x2 = 0,\n          y2 = 0,\n          ox, oy;\n\n      function setPressed(pos) //{{{\n      {\n        pos = rebound(pos);\n        x2 = x1 = pos[0];\n        y2 = y1 = pos[1];\n      }\n      //}}}\n      function setCurrent(pos) //{{{\n      {\n        pos = rebound(pos);\n        ox = pos[0] - x2;\n        oy = pos[1] - y2;\n        x2 = pos[0];\n        y2 = pos[1];\n      }\n      //}}}\n      function getOffset() //{{{\n      {\n        return [ox, oy];\n      }\n      //}}}\n      function moveOffset(offset) //{{{\n      {\n        var ox = offset[0],\n            oy = offset[1];\n\n        if (0 > x1 + ox) {\n          ox -= ox + x1;\n        }\n        if (0 > y1 + oy) {\n          oy -= oy + y1;\n        }\n\n        if (boundy < y2 + oy) {\n          oy += boundy - (y2 + oy);\n        }\n        if (boundx < x2 + ox) {\n          ox += boundx - (x2 + ox);\n        }\n\n        x1 += ox;\n        x2 += ox;\n        y1 += oy;\n        y2 += oy;\n      }\n      //}}}\n      function getCorner(ord) //{{{\n      {\n        var c = getFixed();\n        switch (ord) {\n        case 'ne':\n          return [c.x2, c.y];\n        case 'nw':\n          return [c.x, c.y];\n        case 'se':\n          return [c.x2, c.y2];\n        case 'sw':\n          return [c.x, c.y2];\n        }\n      }\n      //}}}\n      function getFixed() //{{{\n      {\n        if (!options.aspectRatio) {\n          return getRect();\n        }\n        // This function could use some optimization I think...\n        var aspect = options.aspectRatio,\n            min_x = options.minSize[0] / xscale,\n            \n            \n            //min_y = options.minSize[1]/yscale,\n            max_x = options.maxSize[0] / xscale,\n            max_y = options.maxSize[1] / yscale,\n            rw = x2 - x1,\n            rh = y2 - y1,\n            rwa = Math.abs(rw),\n            rha = Math.abs(rh),\n            real_ratio = rwa / rha,\n            xx, yy, w, h;\n\n        if (max_x === 0) {\n          max_x = boundx * 10;\n        }\n        if (max_y === 0) {\n          max_y = boundy * 10;\n        }\n        if (real_ratio < aspect) {\n          yy = y2;\n          w = rha * aspect;\n          xx = rw < 0 ? x1 - w : w + x1;\n\n          if (xx < 0) {\n            xx = 0;\n            h = Math.abs((xx - x1) / aspect);\n            yy = rh < 0 ? y1 - h : h + y1;\n          } else if (xx > boundx) {\n            xx = boundx;\n            h = Math.abs((xx - x1) / aspect);\n            yy = rh < 0 ? y1 - h : h + y1;\n          }\n        } else {\n          xx = x2;\n          h = rwa / aspect;\n          yy = rh < 0 ? y1 - h : y1 + h;\n          if (yy < 0) {\n            yy = 0;\n            w = Math.abs((yy - y1) * aspect);\n            xx = rw < 0 ? x1 - w : w + x1;\n          } else if (yy > boundy) {\n            yy = boundy;\n            w = Math.abs(yy - y1) * aspect;\n            xx = rw < 0 ? x1 - w : w + x1;\n          }\n        }\n\n        // Magic %-)\n        if (xx > x1) { // right side\n          if (xx - x1 < min_x) {\n            xx = x1 + min_x;\n          } else if (xx - x1 > max_x) {\n            xx = x1 + max_x;\n          }\n          if (yy > y1) {\n            yy = y1 + (xx - x1) / aspect;\n          } else {\n            yy = y1 - (xx - x1) / aspect;\n          }\n        } else if (xx < x1) { // left side\n          if (x1 - xx < min_x) {\n            xx = x1 - min_x;\n          } else if (x1 - xx > max_x) {\n            xx = x1 - max_x;\n          }\n          if (yy > y1) {\n            yy = y1 + (x1 - xx) / aspect;\n          } else {\n            yy = y1 - (x1 - xx) / aspect;\n          }\n        }\n\n        if (xx < 0) {\n          x1 -= xx;\n          xx = 0;\n        } else if (xx > boundx) {\n          x1 -= xx - boundx;\n          xx = boundx;\n        }\n\n        if (yy < 0) {\n          y1 -= yy;\n          yy = 0;\n        } else if (yy > boundy) {\n          y1 -= yy - boundy;\n          yy = boundy;\n        }\n\n        return makeObj(flipCoords(x1, y1, xx, yy));\n      }\n      //}}}\n      function rebound(p) //{{{\n      {\n        if (p[0] < 0) {\n          p[0] = 0;\n        }\n        if (p[1] < 0) {\n          p[1] = 0;\n        }\n\n        if (p[0] > boundx) {\n          p[0] = boundx;\n        }\n        if (p[1] > boundy) {\n          p[1] = boundy;\n        }\n\n        return [p[0], p[1]];\n      }\n      //}}}\n      function flipCoords(x1, y1, x2, y2) //{{{\n      {\n        var xa = x1,\n            xb = x2,\n            ya = y1,\n            yb = y2;\n        if (x2 < x1) {\n          xa = x2;\n          xb = x1;\n        }\n        if (y2 < y1) {\n          ya = y2;\n          yb = y1;\n        }\n        return [xa, ya, xb, yb];\n      }\n      //}}}\n      function getRect() //{{{\n      {\n        var xsize = x2 - x1,\n            ysize = y2 - y1,\n            delta;\n\n        if (xlimit && (Math.abs(xsize) > xlimit)) {\n          x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);\n        }\n        if (ylimit && (Math.abs(ysize) > ylimit)) {\n          y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);\n        }\n\n        if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) {\n          y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale);\n        }\n        if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) {\n          x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale);\n        }\n\n        if (x1 < 0) {\n          x2 -= x1;\n          x1 -= x1;\n        }\n        if (y1 < 0) {\n          y2 -= y1;\n          y1 -= y1;\n        }\n        if (x2 < 0) {\n          x1 -= x2;\n          x2 -= x2;\n        }\n        if (y2 < 0) {\n          y1 -= y2;\n          y2 -= y2;\n        }\n        if (x2 > boundx) {\n          delta = x2 - boundx;\n          x1 -= delta;\n          x2 -= delta;\n        }\n        if (y2 > boundy) {\n          delta = y2 - boundy;\n          y1 -= delta;\n          y2 -= delta;\n        }\n        if (x1 > boundx) {\n          delta = x1 - boundy;\n          y2 -= delta;\n          y1 -= delta;\n        }\n        if (y1 > boundy) {\n          delta = y1 - boundy;\n          y2 -= delta;\n          y1 -= delta;\n        }\n\n        return makeObj(flipCoords(x1, y1, x2, y2));\n      }\n      //}}}\n      function makeObj(a) //{{{\n      {\n        return {\n          x: a[0],\n          y: a[1],\n          x2: a[2],\n          y2: a[3],\n          w: a[2] - a[0],\n          h: a[3] - a[1]\n        };\n      }\n      //}}}\n\n      return {\n        flipCoords: flipCoords,\n        setPressed: setPressed,\n        setCurrent: setCurrent,\n        getOffset: getOffset,\n        moveOffset: moveOffset,\n        getCorner: getCorner,\n        getFixed: getFixed\n      };\n    }());\n\n    //}}}\n    // Shade Module {{{\n    var Shade = (function() {\n      var enabled = false,\n          holder = $('<div />').css({\n            position: 'absolute',\n            zIndex: 240,\n            opacity: 0\n          }),\n          shades = {\n            top: createShade(),\n            left: createShade().height(boundy),\n            right: createShade().height(boundy),\n            bottom: createShade()\n          };\n\n      function resizeShades(w,h) {\n        shades.left.css({ height: px(h) });\n        shades.right.css({ height: px(h) });\n      }\n      function updateAuto()\n      {\n        return updateShade(Coords.getFixed());\n      }\n      function updateShade(c)\n      {\n        shades.top.css({\n          left: px(c.x),\n          width: px(c.w),\n          height: px(c.y)\n        });\n        shades.bottom.css({\n          top: px(c.y2),\n          left: px(c.x),\n          width: px(c.w),\n          height: px(boundy-c.y2)\n        });\n        shades.right.css({\n          left: px(c.x2),\n          width: px(boundx-c.x2)\n        });\n        shades.left.css({\n          width: px(c.x)\n        });\n      }\n      function createShade() {\n        return $('<div />').css({\n          position: 'absolute',\n          backgroundColor: options.shadeColor||options.bgColor\n        }).appendTo(holder);\n      }\n      function enableShade() {\n        if (!enabled) {\n          enabled = true;\n          holder.insertBefore($img);\n          updateAuto();\n          Selection.setBgOpacity(1,0,1);\n          $img2.hide();\n\n          setBgColor(options.shadeColor||options.bgColor,1);\n          if (Selection.isAwake())\n          {\n            setOpacity(options.bgOpacity,1);\n          }\n            else setOpacity(1,1);\n        }\n      }\n      function setBgColor(color,now) {\n        colorChangeMacro(getShades(),color,now);\n      }\n      function disableShade() {\n        if (enabled) {\n          holder.remove();\n          $img2.show();\n          enabled = false;\n          if (Selection.isAwake()) {\n            Selection.setBgOpacity(options.bgOpacity,1,1);\n          } else {\n            Selection.setBgOpacity(1,1,1);\n            Selection.disableHandles();\n          }\n          colorChangeMacro($div,0,1);\n        }\n      }\n      function setOpacity(opacity,now) {\n        if (enabled) {\n          if (options.bgFade && !now) {\n            holder.animate({\n              opacity: 1-opacity\n            },{\n              queue: false,\n              duration: options.fadeTime\n            });\n          }\n          else holder.css({opacity:1-opacity});\n        }\n      }\n      function refreshAll() {\n        options.shade ? enableShade() : disableShade();\n        if (Selection.isAwake()) setOpacity(options.bgOpacity);\n      }\n      function getShades() {\n        return holder.children();\n      }\n\n      return {\n        update: updateAuto,\n        updateRaw: updateShade,\n        getShades: getShades,\n        setBgColor: setBgColor,\n        enable: enableShade,\n        disable: disableShade,\n        resize: resizeShades,\n        refresh: refreshAll,\n        opacity: setOpacity\n      };\n    }());\n    // }}}\n    // Selection Module {{{\n    var Selection = (function () {\n      var awake,\n          hdep = 370,\n          borders = {},\n          handle = {},\n          dragbar = {},\n          seehandles = false;\n\n      // Private Methods\n      function insertBorder(type) //{{{\n      {\n        var jq = $('<div />').css({\n          position: 'absolute',\n          opacity: options.borderOpacity\n        }).addClass(cssClass(type));\n        $img_holder.append(jq);\n        return jq;\n      }\n      //}}}\n      function dragDiv(ord, zi) //{{{\n      {\n        var jq = $('<div />').mousedown(createDragger(ord)).css({\n          cursor: ord + '-resize',\n          position: 'absolute',\n          zIndex: zi\n        }).addClass('ord-'+ord);\n\n        if (Touch.support) {\n          jq.bind('touchstart.jcrop', Touch.createDragger(ord));\n        }\n\n        $hdl_holder.append(jq);\n        return jq;\n      }\n      //}}}\n      function insertHandle(ord) //{{{\n      {\n        var hs = options.handleSize;\n        return dragDiv(ord, hdep++).css({\n          opacity: options.handleOpacity\n        }).width(hs).height(hs).addClass(cssClass('handle'));\n      }\n      //}}}\n      function insertDragbar(ord) //{{{\n      {\n        return dragDiv(ord, hdep++).addClass('jcrop-dragbar');\n      }\n      //}}}\n      function createDragbars(li) //{{{\n      {\n        var i;\n        for (i = 0; i < li.length; i++) {\n          dragbar[li[i]] = insertDragbar(li[i]);\n        }\n      }\n      //}}}\n      function createBorders(li) //{{{\n      {\n        var cl,i;\n        for (i = 0; i < li.length; i++) {\n          switch(li[i]){\n            case'n': cl='hline'; break;\n            case's': cl='hline bottom'; break;\n            case'e': cl='vline right'; break;\n            case'w': cl='vline'; break;\n          }\n          borders[li[i]] = insertBorder(cl);\n        }\n      }\n      //}}}\n      function createHandles(li) //{{{\n      {\n        var i;\n        for (i = 0; i < li.length; i++) {\n          handle[li[i]] = insertHandle(li[i]);\n        }\n      }\n      //}}}\n      function moveto(x, y) //{{{\n      {\n        if (!options.shade) {\n          $img2.css({\n            top: px(-y),\n            left: px(-x)\n          });\n        }\n        $sel.css({\n          top: px(y),\n          left: px(x)\n        });\n      }\n      //}}}\n      function resize(w, h) //{{{\n      {\n        $sel.width(w).height(h);\n      }\n      //}}}\n      function refresh() //{{{\n      {\n        var c = Coords.getFixed();\n\n        Coords.setPressed([c.x, c.y]);\n        Coords.setCurrent([c.x2, c.y2]);\n\n        updateVisible();\n      }\n      //}}}\n\n      // Internal Methods\n      function updateVisible(select) //{{{\n      {\n        if (awake) {\n          return update(select);\n        }\n      }\n      //}}}\n      function update(select) //{{{\n      {\n        var c = Coords.getFixed();\n\n        resize(c.w, c.h);\n        moveto(c.x, c.y);\n        if (options.shade) Shade.updateRaw(c);\n\n        awake || show();\n\n        if (select) {\n          options.onSelect.call(api, unscale(c));\n        } else {\n          options.onChange.call(api, unscale(c));\n        }\n      }\n      //}}}\n      function setBgOpacity(opacity,force,now) //{{{\n      {\n        if (!awake && !force) return;\n        if (options.bgFade && !now) {\n          $img.animate({\n            opacity: opacity\n          },{\n            queue: false,\n            duration: options.fadeTime\n          });\n        } else {\n          $img.css('opacity', opacity);\n        }\n      }\n      //}}}\n      function show() //{{{\n      {\n        $sel.show();\n\n        if (options.shade) Shade.opacity(bgopacity);\n          else setBgOpacity(bgopacity,true);\n\n        awake = true;\n      }\n      //}}}\n      function release() //{{{\n      {\n        disableHandles();\n        $sel.hide();\n\n        if (options.shade) Shade.opacity(1);\n          else setBgOpacity(1);\n\n        awake = false;\n        options.onRelease.call(api);\n      }\n      //}}}\n      function showHandles() //{{{\n      {\n        if (seehandles) {\n          $hdl_holder.show();\n        }\n      }\n      //}}}\n      function enableHandles() //{{{\n      {\n        seehandles = true;\n        if (options.allowResize) {\n          $hdl_holder.show();\n          return true;\n        }\n      }\n      //}}}\n      function disableHandles() //{{{\n      {\n        seehandles = false;\n        $hdl_holder.hide();\n      } \n      //}}}\n      function animMode(v) //{{{\n      {\n        if (animating === v) {\n          disableHandles();\n        } else {\n          enableHandles();\n        }\n      } \n      //}}}\n      function done() //{{{\n      {\n        animMode(false);\n        refresh();\n      } \n      //}}}\n      // Insert draggable elements {{{\n      // Insert border divs for outline\n\n      if (options.dragEdges && $.isArray(options.createDragbars))\n        createDragbars(options.createDragbars);\n\n      if ($.isArray(options.createHandles))\n        createHandles(options.createHandles);\n\n      if (options.drawBorders && $.isArray(options.createBorders))\n        createBorders(options.createBorders);\n\n      //}}}\n\n      // This is a hack for iOS5 to support drag/move touch functionality\n      $(document).bind('touchstart.jcrop-ios',function(e) {\n        if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation();\n      });\n\n      var $track = newTracker().mousedown(createDragger('move')).css({\n        cursor: 'move',\n        position: 'absolute',\n        zIndex: 360\n      });\n\n      if (Touch.support) {\n        $track.bind('touchstart.jcrop', Touch.createDragger('move'));\n      }\n\n      $img_holder.append($track);\n      disableHandles();\n\n      return {\n        updateVisible: updateVisible,\n        update: update,\n        release: release,\n        refresh: refresh,\n        isAwake: function () {\n          return awake;\n        },\n        setCursor: function (cursor) {\n          $track.css('cursor', cursor);\n        },\n        enableHandles: enableHandles,\n        enableOnly: function () {\n          seehandles = true;\n        },\n        showHandles: showHandles,\n        disableHandles: disableHandles,\n        animMode: animMode,\n        setBgOpacity: setBgOpacity,\n        done: done\n      };\n    }());\n    \n    //}}}\n    // Tracker Module {{{\n    var Tracker = (function () {\n      var onMove = function () {},\n          onDone = function () {},\n          trackDoc = options.trackDocument;\n\n      function toFront() //{{{\n      {\n        $trk.css({\n          zIndex: 450\n        });\n        if (Touch.support) {\n          $(document)\n            .bind('touchmove.jcrop', trackTouchMove)\n            .bind('touchend.jcrop', trackTouchEnd);\n        }\n        if (trackDoc) {\n          $(document)\n            .bind('mousemove.jcrop',trackMove)\n            .bind('mouseup.jcrop',trackUp);\n        }\n      } \n      //}}}\n      function toBack() //{{{\n      {\n        $trk.css({\n          zIndex: 290\n        });\n        $(document).unbind('.jcrop');\n      } \n      //}}}\n      function trackMove(e) //{{{\n      {\n        onMove(mouseAbs(e));\n        return false;\n      } \n      //}}}\n      function trackUp(e) //{{{\n      {\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (btndown) {\n          btndown = false;\n\n          onDone(mouseAbs(e));\n\n          if (Selection.isAwake()) {\n            options.onSelect.call(api, unscale(Coords.getFixed()));\n          }\n\n          toBack();\n          onMove = function () {};\n          onDone = function () {};\n        }\n\n        return false;\n      }\n      //}}}\n      function activateHandlers(move, done) //{{{\n      {\n        btndown = true;\n        onMove = move;\n        onDone = done;\n        toFront();\n        return false;\n      }\n      //}}}\n      function trackTouchMove(e) //{{{\n      {\n        e.pageX = e.originalEvent.changedTouches[0].pageX;\n        e.pageY = e.originalEvent.changedTouches[0].pageY;\n        return trackMove(e);\n      }\n      //}}}\n      function trackTouchEnd(e) //{{{\n      {\n        e.pageX = e.originalEvent.changedTouches[0].pageX;\n        e.pageY = e.originalEvent.changedTouches[0].pageY;\n        return trackUp(e);\n      }\n      //}}}\n      function setCursor(t) //{{{\n      {\n        $trk.css('cursor', t);\n      }\n      //}}}\n\n      if (!trackDoc) {\n        $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);\n      }\n\n      $img.before($trk);\n      return {\n        activateHandlers: activateHandlers,\n        setCursor: setCursor\n      };\n    }());\n    //}}}\n    // KeyManager Module {{{\n    var KeyManager = (function () {\n      var $keymgr = $('<input type=\"radio\" />').css({\n        position: 'fixed',\n        left: '-120px',\n        width: '12px'\n      }),\n          $keywrap = $('<div />').css({\n          position: 'absolute',\n          overflow: 'hidden'\n        }).append($keymgr);\n\n      function watchKeys() //{{{\n      {\n        if (options.keySupport) {\n          $keymgr.show();\n          $keymgr.focus();\n        }\n      }\n      //}}}\n      function onBlur(e) //{{{\n      {\n        $keymgr.hide();\n      }\n      //}}}\n      function doNudge(e, x, y) //{{{\n      {\n        if (options.allowMove) {\n          Coords.moveOffset([x, y]);\n          Selection.updateVisible(true);\n        }\n        e.preventDefault();\n        e.stopPropagation();\n      }\n      //}}}\n      function parseKey(e) //{{{\n      {\n        if (e.ctrlKey || e.metaKey) {\n          return true;\n        }\n        shift_down = e.shiftKey ? true : false;\n        var nudge = shift_down ? 10 : 1;\n\n        switch (e.keyCode) {\n        case 37:\n          doNudge(e, -nudge, 0);\n          break;\n        case 39:\n          doNudge(e, nudge, 0);\n          break;\n        case 38:\n          doNudge(e, 0, -nudge);\n          break;\n        case 40:\n          doNudge(e, 0, nudge);\n          break;\n        case 27:\n          if (options.allowSelect) Selection.release();\n          break;\n        case 9:\n          return true;\n        }\n\n        return false;\n      }\n      //}}}\n\n      if (options.keySupport) {\n        $keymgr.keydown(parseKey).blur(onBlur);\n        if (ie6mode || !options.fixedSupport) {\n          $keymgr.css({\n            position: 'absolute',\n            left: '-20px'\n          });\n          $keywrap.append($keymgr).insertBefore($img);\n        } else {\n          $keymgr.insertBefore($img);\n        }\n      }\n\n\n      return {\n        watchKeys: watchKeys\n      };\n    }());\n    //}}}\n    // }}}\n    // API methods {{{\n    function setClass(cname) //{{{\n    {\n      $div.removeClass().addClass(cssClass('holder')).addClass(cname);\n    }\n    //}}}\n    function animateTo(a, callback) //{{{\n    {\n      var x1 = a[0] / xscale,\n          y1 = a[1] / yscale,\n          x2 = a[2] / xscale,\n          y2 = a[3] / yscale;\n\n      if (animating) {\n        return;\n      }\n\n      var animto = Coords.flipCoords(x1, y1, x2, y2),\n          c = Coords.getFixed(),\n          initcr = [c.x, c.y, c.x2, c.y2],\n          animat = initcr,\n          interv = options.animationDelay,\n          ix1 = animto[0] - initcr[0],\n          iy1 = animto[1] - initcr[1],\n          ix2 = animto[2] - initcr[2],\n          iy2 = animto[3] - initcr[3],\n          pcent = 0,\n          velocity = options.swingSpeed;\n\n      x = animat[0];\n      y = animat[1];\n      x2 = animat[2];\n      y2 = animat[3];\n\n      Selection.animMode(true);\n      var anim_timer;\n\n      function queueAnimator() {\n        window.setTimeout(animator, interv);\n      }\n      var animator = (function () {\n        return function () {\n          pcent += (100 - pcent) / velocity;\n\n          animat[0] = x + ((pcent / 100) * ix1);\n          animat[1] = y + ((pcent / 100) * iy1);\n          animat[2] = x2 + ((pcent / 100) * ix2);\n          animat[3] = y2 + ((pcent / 100) * iy2);\n\n          if (pcent >= 99.8) {\n            pcent = 100;\n          }\n          if (pcent < 100) {\n            setSelectRaw(animat);\n            queueAnimator();\n          } else {\n            Selection.done();\n            if (typeof(callback) === 'function') {\n              callback.call(api);\n            }\n          }\n        };\n      }());\n      queueAnimator();\n    }\n    //}}}\n    function setSelect(rect) //{{{\n    {\n      setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale]);\n      options.onSelect.call(api, unscale(Coords.getFixed()));\n      Selection.enableHandles();\n    }\n    //}}}\n    function setSelectRaw(l) //{{{\n    {\n      Coords.setPressed([l[0], l[1]]);\n      Coords.setCurrent([l[2], l[3]]);\n      Selection.update();\n    }\n    //}}}\n    function tellSelect() //{{{\n    {\n      return unscale(Coords.getFixed());\n    }\n    //}}}\n    function tellScaled() //{{{\n    {\n      return Coords.getFixed();\n    }\n    //}}}\n    function setOptionsNew(opt) //{{{\n    {\n      setOptions(opt);\n      interfaceUpdate();\n    }\n    //}}}\n    function disableCrop() //{{{\n    {\n      options.disabled = true;\n      Selection.disableHandles();\n      Selection.setCursor('default');\n      Tracker.setCursor('default');\n    }\n    //}}}\n    function enableCrop() //{{{\n    {\n      options.disabled = false;\n      interfaceUpdate();\n    }\n    //}}}\n    function cancelCrop() //{{{\n    {\n      Selection.done();\n      Tracker.activateHandlers(null, null);\n    }\n    //}}}\n    function destroy() //{{{\n    {\n      $div.remove();\n      $origimg.show();\n      $(obj).removeData('Jcrop');\n    }\n    //}}}\n    function setImage(src, callback) //{{{\n    {\n      Selection.release();\n      disableCrop();\n      var img = new Image();\n      img.onload = function () {\n        var iw = img.width;\n        var ih = img.height;\n        var bw = options.boxWidth;\n        var bh = options.boxHeight;\n        $img.width(iw).height(ih);\n        $img.attr('src', src);\n        $img2.attr('src', src);\n        presize($img, bw, bh);\n        boundx = $img.width();\n        boundy = $img.height();\n        $img2.width(boundx).height(boundy);\n        $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2));\n        $div.width(boundx).height(boundy);\n        Shade.resize(boundx,boundy);\n        enableCrop();\n\n        if (typeof(callback) === 'function') {\n          callback.call(api);\n        }\n      };\n      img.src = src;\n    }\n    //}}}\n    function colorChangeMacro($obj,color,now) {\n      var mycolor = color || options.bgColor;\n      if (options.bgFade && supportsColorFade() && options.fadeTime && !now) {\n        $obj.animate({\n          backgroundColor: mycolor\n        }, {\n          queue: false,\n          duration: options.fadeTime\n        });\n      } else {\n        $obj.css('backgroundColor', mycolor);\n      }\n    }\n    function interfaceUpdate(alt) //{{{\n    // This method tweaks the interface based on options object.\n    // Called when options are changed and at end of initialization.\n    {\n      if (options.allowResize) {\n        if (alt) {\n          Selection.enableOnly();\n        } else {\n          Selection.enableHandles();\n        }\n      } else {\n        Selection.disableHandles();\n      }\n\n      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');\n      Selection.setCursor(options.allowMove ? 'move' : 'default');\n\n      if (options.hasOwnProperty('trueSize')) {\n        xscale = options.trueSize[0] / boundx;\n        yscale = options.trueSize[1] / boundy;\n      }\n\n      if (options.hasOwnProperty('setSelect')) {\n        setSelect(options.setSelect);\n        Selection.done();\n        delete(options.setSelect);\n      }\n\n      Shade.refresh();\n\n      if (options.bgColor != bgcolor) {\n        colorChangeMacro(\n          options.shade? Shade.getShades(): $div,\n          options.shade?\n            (options.shadeColor || options.bgColor):\n            options.bgColor\n        );\n        bgcolor = options.bgColor;\n      }\n\n      if (bgopacity != options.bgOpacity) {\n        bgopacity = options.bgOpacity;\n        if (options.shade) Shade.refresh();\n          else Selection.setBgOpacity(bgopacity);\n      }\n\n      xlimit = options.maxSize[0] || 0;\n      ylimit = options.maxSize[1] || 0;\n      xmin = options.minSize[0] || 0;\n      ymin = options.minSize[1] || 0;\n\n      if (options.hasOwnProperty('outerImage')) {\n        $img.attr('src', options.outerImage);\n        delete(options.outerImage);\n      }\n\n      Selection.refresh();\n    }\n    //}}}\n    //}}}\n\n    if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection);\n\n    $hdl_holder.hide();\n    interfaceUpdate(true);\n\n    var api = {\n      setImage: setImage,\n      animateTo: animateTo,\n      setSelect: setSelect,\n      setOptions: setOptionsNew,\n      tellSelect: tellSelect,\n      tellScaled: tellScaled,\n      setClass: setClass,\n\n      disable: disableCrop,\n      enable: enableCrop,\n      cancel: cancelCrop,\n      release: Selection.release,\n      destroy: destroy,\n\n      focus: KeyManager.watchKeys,\n\n      getBounds: function () {\n        return [boundx * xscale, boundy * yscale];\n      },\n      getWidgetSize: function () {\n        return [boundx, boundy];\n      },\n      getScaleFactor: function () {\n        return [xscale, yscale];\n      },\n      getOptions: function() {\n        // careful: internal values are returned\n        return options;\n      },\n\n      ui: {\n        holder: $div,\n        selection: $sel\n      }\n    };\n\n    if ($.browser.msie)\n      $div.bind('selectstart', function () { return false; });\n\n    $origimg.data('Jcrop', api);\n    return api;\n  };\n  $.fn.Jcrop = function (options, callback) //{{{\n  {\n    var api;\n    // Iterate over each object, attach Jcrop\n    this.each(function () {\n      // If we've already attached to this object\n      if ($(this).data('Jcrop')) {\n        // The API can be requested this way (undocumented)\n        if (options === 'api') return $(this).data('Jcrop');\n        // Otherwise, we just reset the options...\n        else $(this).data('Jcrop').setOptions(options);\n      }\n      // If we haven't been attached, preload and attach\n      else {\n        if (this.tagName == 'IMG')\n          $.Jcrop.Loader(this,function(){\n            $(this).css({display:'block',visibility:'hidden'});\n            api = $.Jcrop(this, options);\n            if ($.isFunction(callback)) callback.call(api);\n          });\n        else {\n          $(this).css({display:'block',visibility:'hidden'});\n          api = $.Jcrop(this, options);\n          if ($.isFunction(callback)) callback.call(api);\n        }\n      }\n    });\n\n    // Return \"this\" so the object is chainable (jQuery-style)\n    return this;\n  };\n  //}}}\n  // $.Jcrop.Loader - basic image loader {{{\n\n  $.Jcrop.Loader = function(imgobj,success,error){\n    var $img = $(imgobj), img = $img[0];\n\n    function completeCheck(){\n      if (img.complete) {\n        $img.unbind('.jcloader');\n        if ($.isFunction(success)) success.call(img);\n      }\n      else window.setTimeout(completeCheck,50);\n    }\n\n    $img\n      .bind('load.jcloader',completeCheck)\n      .bind('error.jcloader',function(e){\n        $img.unbind('.jcloader');\n        if ($.isFunction(error)) error.call(img);\n      });\n\n    if (img.complete && $.isFunction(success)){\n      $img.unbind('.jcloader');\n      success.call(img);\n    }\n  };\n\n  //}}}\n  // Global Defaults {{{\n  $.Jcrop.defaults = {\n\n    // Basic Settings\n    allowSelect: true,\n    allowMove: true,\n    allowResize: true,\n\n    trackDocument: true,\n\n    // Styling Options\n    baseClass: 'jcrop',\n    addClass: null,\n    bgColor: 'black',\n    bgOpacity: 0.6,\n    bgFade: false,\n    borderOpacity: 0.4,\n    handleOpacity: 0.5,\n    handleSize: 7,\n\n    aspectRatio: 0,\n    keySupport: true,\n    createHandles: ['n','s','e','w','nw','ne','se','sw'],\n    createDragbars: ['n','s','e','w'],\n    createBorders: ['n','s','e','w'],\n    drawBorders: true,\n    dragEdges: true,\n    fixedSupport: true,\n    touchSupport: null,\n\n    shade: null,\n\n    boxWidth: 0,\n    boxHeight: 0,\n    boundary: 2,\n    fadeTime: 400,\n    animationDelay: 20,\n    swingSpeed: 3,\n\n    minSelect: [0, 0],\n    maxSize: [0, 0],\n    minSize: [0, 0],\n\n    // Callbacks / Event Handlers\n    onChange: function () {},\n    onSelect: function () {},\n    onDblClick: function () {},\n    onRelease: function () {}\n  };\n\n  // }}}\n}(jQuery));\n"
  },
  {
    "path": "set/uploadify/jquery.uploadify-3.1.js",
    "content": "/*\nSWFObject v2.2 <http://code.google.com/p/swfobject/> \nis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\n;var swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;\nif(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;\nX=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);\nag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0;}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");\nif(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)];}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac};\n}(),k=function(){if(!M.w3){return;}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f();\n}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false);}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);\nf();}});if(O==top){(function(){if(J){return;}try{j.documentElement.doScroll(\"left\");}catch(X){setTimeout(arguments.callee,0);return;}f();})();}}if(M.wk){(function(){if(J){return;\n}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return;}f();})();}s(f);}}();function f(){if(J){return;}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));\nZ.parentNode.removeChild(Z);}catch(aa){return;}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]();}}function K(X){if(J){X();}else{U[U.length]=X;}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false);\n}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false);}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y);}else{if(typeof O.onload==\"function\"){var X=O.onload;\nO.onload=function(){X();Y();};}else{O.onload=Y;}}}}}function h(){if(T){V();}else{H();}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);\naa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");\nM.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)];}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return;}}X.removeChild(aa);Z=null;H();\n})();}else{H();}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);\nif(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa);}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;\nai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\");}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\");\n}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\");\n}}P(ai,ah,Y,ab);}else{p(ae);if(ab){ab(aa);}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z;}ab(aa);}}}}}function z(aa){var X=null;\nvar Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y;}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z;}}}return X;}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312);\n}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null;}else{l=ae;Q=X;}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\";\n}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\";}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";\nvar ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac;\n}else{ab.flashvars=ac;}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";\n(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae);}else{setTimeout(arguments.callee,10);}})();}u(aa,ab,X);}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");\nY.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y);}else{setTimeout(arguments.callee,10);\n}})();}else{Y.parentNode.replaceChild(g(Y),Y);}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML;}else{var Y=ab.getElementsByTagName(r)[0];\nif(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true));\n}}}}}return aa;}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X;}if(aa){if(typeof ai.id==D){ai.id=Y;}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae];\n}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"';}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"';}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />';\n}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id);}else{var Z=C(r);Z.setAttribute(\"type\",q);\nfor(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac]);}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac]);\n}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab]);}}aa.parentNode.replaceChild(Z,aa);X=Z;}}return X;}function e(Z,X,Y){var aa=C(\"param\");\naa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa);}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";\n(function(){if(X.readyState==4){b(Y);}else{setTimeout(arguments.callee,10);}})();}else{X.parentNode.removeChild(X);}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null;\n}}Y.parentNode.removeChild(Y);}}function c(Z){var X=null;try{X=j.getElementById(Z);}catch(Y){}return X;}function C(X){return j.createElement(X);}function i(Z,X,Y){Z.attachEvent(X,Y);\nI[I.length]=[Z,X,Y];}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false;\n}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return;}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return;}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;\nG=null;}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1];\n}G=X;}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y);}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"));\n}}}function w(Z,X){if(!m){return;}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y;}else{v(\"#\"+Z,\"visibility:\"+Y);}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;\nvar X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y;}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;\nfor(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2]);}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa]);}for(var Y in M){M[Y]=null;}M=null;for(var X in swfobject){swfobject[X]=null;\n}swfobject=null;});}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;\nw(ab,false);}else{if(Z){Z({success:false,id:ab});}}},getObjectById:function(X){if(M.w3){return z(X);}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};\nif(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al];}}aj.data=ab;\naj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak];}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai];\n}else{am.flashvars=ai+\"=\"+Z[ai];}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true);}X.success=true;X.ref=an;}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);\nreturn;}else{w(ah,true);}}if(ac){ac(X);}});}else{if(ac){ac(X);}}},switchOffAutoHideShow:function(){m=false;},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]};\n},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X);}else{return undefined;}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y);\n}},removeSWF:function(X){if(M.w3){y(X);}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X);}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;\nif(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1];}if(aa==null){return L(Z);}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)));\n}}}return\"\";},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\";\n}}if(E){E(B);}}a=false;}}};}();\n\n/*\nSWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com\n\nmmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/\n\nSWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:\nhttp://www.opensource.org/licenses/mit-license.php\n \nSWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:\nhttp://www.opensource.org/licenses/mit-license.php\n*/\n\nvar SWFUpload;if(SWFUpload==undefined){SWFUpload=function(a){this.initSWFUpload(a)}}SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={};this.settings=b;this.eventQueue=[];this.movieName=\"SWFUpload_\"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo()}catch(a){delete SWFUpload.instances[this.movieName];throw a}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version=\"2.2.0 2009-03-25\";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:\"window\",TRANSPARENT:\"transparent\",OPAQUE:\"opaque\"};SWFUpload.completeURL=function(a){if(typeof(a)!==\"string\"||a.match(/^https?:\\/\\//i)||a.match(/^\\//)){return a}var c=window.location.protocol+\"//\"+window.location.hostname+(window.location.port?\":\"+window.location.port:\"\");var b=window.location.pathname.lastIndexOf(\"/\");if(b<=0){path=\"/\"}else{path=window.location.pathname.substr(0,b)+\"/\"}return path+a};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,a){this.settings[b]=(this.settings[b]==undefined)?a:this.settings[b]};this.ensureDefault(\"upload_url\",\"\");this.ensureDefault(\"preserve_relative_urls\",false);this.ensureDefault(\"file_post_name\",\"Filedata\");this.ensureDefault(\"post_params\",{});this.ensureDefault(\"use_query_string\",false);this.ensureDefault(\"requeue_on_error\",false);this.ensureDefault(\"http_success\",[]);this.ensureDefault(\"assume_success_timeout\",0);this.ensureDefault(\"file_types\",\"*.*\");this.ensureDefault(\"file_types_description\",\"All Files\");this.ensureDefault(\"file_size_limit\",0);this.ensureDefault(\"file_upload_limit\",0);this.ensureDefault(\"file_queue_limit\",0);this.ensureDefault(\"flash_url\",\"swfupload.swf\");this.ensureDefault(\"prevent_swf_caching\",true);this.ensureDefault(\"button_image_url\",\"\");this.ensureDefault(\"button_width\",1);this.ensureDefault(\"button_height\",1);this.ensureDefault(\"button_text\",\"\");this.ensureDefault(\"button_text_style\",\"color: #000000; font-size: 16pt;\");this.ensureDefault(\"button_text_top_padding\",0);this.ensureDefault(\"button_text_left_padding\",0);this.ensureDefault(\"button_action\",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault(\"button_disabled\",false);this.ensureDefault(\"button_placeholder_id\",\"\");this.ensureDefault(\"button_placeholder\",null);this.ensureDefault(\"button_cursor\",SWFUpload.CURSOR.ARROW);this.ensureDefault(\"button_window_mode\",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault(\"debug\",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault(\"swfupload_loaded_handler\",null);this.ensureDefault(\"file_dialog_start_handler\",null);this.ensureDefault(\"file_queued_handler\",null);this.ensureDefault(\"file_queue_error_handler\",null);this.ensureDefault(\"file_dialog_complete_handler\",null);this.ensureDefault(\"upload_start_handler\",null);this.ensureDefault(\"upload_progress_handler\",null);this.ensureDefault(\"upload_error_handler\",null);this.ensureDefault(\"upload_success_handler\",null);this.ensureDefault(\"upload_complete_handler\",null);this.ensureDefault(\"debug_handler\",this.debugMessage);this.ensureDefault(\"custom_settings\",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf(\"?\")<0?\"?\":\"&\")+\"preventswfcaching=\"+new Date().getTime()}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url)}delete this.ensureDefault};SWFUpload.prototype.loadFlash=function(){var a,b;if(document.getElementById(this.movieName)!==null){throw\"ID \"+this.movieName+\" is already in use. The Flash Object could not be added\"}a=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(a==undefined){throw\"Could not find the placeholder element: \"+this.settings.button_placeholder_id}b=document.createElement(\"div\");b.innerHTML=this.getFlashHTML();a.parentNode.replaceChild(b.firstChild,a);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement()}};SWFUpload.prototype.getFlashHTML=function(){return['<object id=\"',this.movieName,'\" type=\"application/x-shockwave-flash\" data=\"',this.settings.flash_url,'\" width=\"',this.settings.button_width,'\" height=\"',this.settings.button_height,'\" class=\"swfupload\">','<param name=\"wmode\" value=\"',this.settings.button_window_mode,'\" />','<param name=\"movie\" value=\"',this.settings.flash_url,'\" />','<param name=\"quality\" value=\"high\" />','<param name=\"menu\" value=\"false\" />','<param name=\"allowScriptAccess\" value=\"always\" />','<param name=\"flashvars\" value=\"'+this.getFlashVars()+'\" />',\"</object>\"].join(\"\")};SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString();var a=this.settings.http_success.join(\",\");return[\"movieName=\",encodeURIComponent(this.movieName),\"&amp;uploadURL=\",encodeURIComponent(this.settings.upload_url),\"&amp;useQueryString=\",encodeURIComponent(this.settings.use_query_string),\"&amp;requeueOnError=\",encodeURIComponent(this.settings.requeue_on_error),\"&amp;httpSuccess=\",encodeURIComponent(a),\"&amp;assumeSuccessTimeout=\",encodeURIComponent(this.settings.assume_success_timeout),\"&amp;params=\",encodeURIComponent(b),\"&amp;filePostName=\",encodeURIComponent(this.settings.file_post_name),\"&amp;fileTypes=\",encodeURIComponent(this.settings.file_types),\"&amp;fileTypesDescription=\",encodeURIComponent(this.settings.file_types_description),\"&amp;fileSizeLimit=\",encodeURIComponent(this.settings.file_size_limit),\"&amp;fileUploadLimit=\",encodeURIComponent(this.settings.file_upload_limit),\"&amp;fileQueueLimit=\",encodeURIComponent(this.settings.file_queue_limit),\"&amp;debugEnabled=\",encodeURIComponent(this.settings.debug_enabled),\"&amp;buttonImageURL=\",encodeURIComponent(this.settings.button_image_url),\"&amp;buttonWidth=\",encodeURIComponent(this.settings.button_width),\"&amp;buttonHeight=\",encodeURIComponent(this.settings.button_height),\"&amp;buttonText=\",encodeURIComponent(this.settings.button_text),\"&amp;buttonTextTopPadding=\",encodeURIComponent(this.settings.button_text_top_padding),\"&amp;buttonTextLeftPadding=\",encodeURIComponent(this.settings.button_text_left_padding),\"&amp;buttonTextStyle=\",encodeURIComponent(this.settings.button_text_style),\"&amp;buttonAction=\",encodeURIComponent(this.settings.button_action),\"&amp;buttonDisabled=\",encodeURIComponent(this.settings.button_disabled),\"&amp;buttonCursor=\",encodeURIComponent(this.settings.button_cursor)].join(\"\")};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName)}if(this.movieElement===null){throw\"Could not find Flash element\"}return this.movieElement};SWFUpload.prototype.buildParamString=function(){var c=this.settings.post_params;var b=[];if(typeof(c)===\"object\"){for(var a in c){if(c.hasOwnProperty(a)){b.push(encodeURIComponent(a.toString())+\"=\"+encodeURIComponent(c[a].toString()))}}}return b.join(\"&amp;\")};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var a=null;a=this.getMovieElement();if(a&&typeof(a.CallFunction)===\"unknown\"){for(var c in a){try{if(typeof(a[c])===\"function\"){a[c]=null}}catch(e){}}try{a.parentNode.removeChild(a)}catch(b){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true}catch(d){return false}};SWFUpload.prototype.displayDebugInfo=function(){this.debug([\"---SWFUpload Instance Info---\\n\",\"Version: \",SWFUpload.version,\"\\n\",\"Movie Name: \",this.movieName,\"\\n\",\"Settings:\\n\",\"\\t\",\"upload_url:               \",this.settings.upload_url,\"\\n\",\"\\t\",\"flash_url:                \",this.settings.flash_url,\"\\n\",\"\\t\",\"use_query_string:         \",this.settings.use_query_string.toString(),\"\\n\",\"\\t\",\"requeue_on_error:         \",this.settings.requeue_on_error.toString(),\"\\n\",\"\\t\",\"http_success:             \",this.settings.http_success.join(\", \"),\"\\n\",\"\\t\",\"assume_success_timeout:   \",this.settings.assume_success_timeout,\"\\n\",\"\\t\",\"file_post_name:           \",this.settings.file_post_name,\"\\n\",\"\\t\",\"post_params:              \",this.settings.post_params.toString(),\"\\n\",\"\\t\",\"file_types:               \",this.settings.file_types,\"\\n\",\"\\t\",\"file_types_description:   \",this.settings.file_types_description,\"\\n\",\"\\t\",\"file_size_limit:          \",this.settings.file_size_limit,\"\\n\",\"\\t\",\"file_upload_limit:        \",this.settings.file_upload_limit,\"\\n\",\"\\t\",\"file_queue_limit:         \",this.settings.file_queue_limit,\"\\n\",\"\\t\",\"debug:                    \",this.settings.debug.toString(),\"\\n\",\"\\t\",\"prevent_swf_caching:      \",this.settings.prevent_swf_caching.toString(),\"\\n\",\"\\t\",\"button_placeholder_id:    \",this.settings.button_placeholder_id.toString(),\"\\n\",\"\\t\",\"button_placeholder:       \",(this.settings.button_placeholder?\"Set\":\"Not Set\"),\"\\n\",\"\\t\",\"button_image_url:         \",this.settings.button_image_url.toString(),\"\\n\",\"\\t\",\"button_width:             \",this.settings.button_width.toString(),\"\\n\",\"\\t\",\"button_height:            \",this.settings.button_height.toString(),\"\\n\",\"\\t\",\"button_text:              \",this.settings.button_text.toString(),\"\\n\",\"\\t\",\"button_text_style:        \",this.settings.button_text_style.toString(),\"\\n\",\"\\t\",\"button_text_top_padding:  \",this.settings.button_text_top_padding.toString(),\"\\n\",\"\\t\",\"button_text_left_padding: \",this.settings.button_text_left_padding.toString(),\"\\n\",\"\\t\",\"button_action:            \",this.settings.button_action.toString(),\"\\n\",\"\\t\",\"button_disabled:          \",this.settings.button_disabled.toString(),\"\\n\",\"\\t\",\"custom_settings:          \",this.settings.custom_settings.toString(),\"\\n\",\"Event Handlers:\\n\",\"\\t\",\"swfupload_loaded_handler assigned:  \",(typeof this.settings.swfupload_loaded_handler===\"function\").toString(),\"\\n\",\"\\t\",\"file_dialog_start_handler assigned: \",(typeof this.settings.file_dialog_start_handler===\"function\").toString(),\"\\n\",\"\\t\",\"file_queued_handler assigned:       \",(typeof this.settings.file_queued_handler===\"function\").toString(),\"\\n\",\"\\t\",\"file_queue_error_handler assigned:  \",(typeof this.settings.file_queue_error_handler===\"function\").toString(),\"\\n\",\"\\t\",\"upload_start_handler assigned:      \",(typeof this.settings.upload_start_handler===\"function\").toString(),\"\\n\",\"\\t\",\"upload_progress_handler assigned:   \",(typeof this.settings.upload_progress_handler===\"function\").toString(),\"\\n\",\"\\t\",\"upload_error_handler assigned:      \",(typeof this.settings.upload_error_handler===\"function\").toString(),\"\\n\",\"\\t\",\"upload_success_handler assigned:    \",(typeof this.settings.upload_success_handler===\"function\").toString(),\"\\n\",\"\\t\",\"upload_complete_handler assigned:   \",(typeof this.settings.upload_complete_handler===\"function\").toString(),\"\\n\",\"\\t\",\"debug_handler assigned:             \",(typeof this.settings.debug_handler===\"function\").toString(),\"\\n\"].join(\"\"))};SWFUpload.prototype.addSetting=function(b,c,a){if(c==undefined){return(this.settings[b]=a)}else{return(this.settings[b]=c)}};SWFUpload.prototype.getSetting=function(a){if(this.settings[a]!=undefined){return this.settings[a]}return\"\"};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction('<invoke name=\"'+functionName+'\" returntype=\"javascript\">'+__flash__argumentsToXML(argumentArray,0)+\"</invoke>\");returnValue=eval(returnString)}catch(ex){throw\"Call to \"+functionName+\" failed\"}if(returnValue!=undefined&&typeof returnValue.post===\"object\"){returnValue=this.unescapeFilePostParams(returnValue)}return returnValue};SWFUpload.prototype.selectFile=function(){this.callFlash(\"SelectFile\")};SWFUpload.prototype.selectFiles=function(){this.callFlash(\"SelectFiles\")};SWFUpload.prototype.startUpload=function(a){this.callFlash(\"StartUpload\",[a])};SWFUpload.prototype.cancelUpload=function(a,b){if(b!==false){b=true}this.callFlash(\"CancelUpload\",[a,b])};SWFUpload.prototype.stopUpload=function(){this.callFlash(\"StopUpload\")};SWFUpload.prototype.getStats=function(){return this.callFlash(\"GetStats\")};SWFUpload.prototype.setStats=function(a){this.callFlash(\"SetStats\",[a])};SWFUpload.prototype.getFile=function(a){if(typeof(a)===\"number\"){return this.callFlash(\"GetFileByIndex\",[a])}else{return this.callFlash(\"GetFile\",[a])}};SWFUpload.prototype.addFileParam=function(a,b,c){return this.callFlash(\"AddFileParam\",[a,b,c])};SWFUpload.prototype.removeFileParam=function(a,b){this.callFlash(\"RemoveFileParam\",[a,b])};SWFUpload.prototype.setUploadURL=function(a){this.settings.upload_url=a.toString();this.callFlash(\"SetUploadURL\",[a])};SWFUpload.prototype.setPostParams=function(a){this.settings.post_params=a;this.callFlash(\"SetPostParams\",[a])};SWFUpload.prototype.addPostParam=function(a,b){this.settings.post_params[a]=b;this.callFlash(\"SetPostParams\",[this.settings.post_params])};SWFUpload.prototype.removePostParam=function(a){delete this.settings.post_params[a];this.callFlash(\"SetPostParams\",[this.settings.post_params])};SWFUpload.prototype.setFileTypes=function(a,b){this.settings.file_types=a;this.settings.file_types_description=b;this.callFlash(\"SetFileTypes\",[a,b])};SWFUpload.prototype.setFileSizeLimit=function(a){this.settings.file_size_limit=a;this.callFlash(\"SetFileSizeLimit\",[a])};SWFUpload.prototype.setFileUploadLimit=function(a){this.settings.file_upload_limit=a;this.callFlash(\"SetFileUploadLimit\",[a])};SWFUpload.prototype.setFileQueueLimit=function(a){this.settings.file_queue_limit=a;this.callFlash(\"SetFileQueueLimit\",[a])};SWFUpload.prototype.setFilePostName=function(a){this.settings.file_post_name=a;this.callFlash(\"SetFilePostName\",[a])};SWFUpload.prototype.setUseQueryString=function(a){this.settings.use_query_string=a;this.callFlash(\"SetUseQueryString\",[a])};SWFUpload.prototype.setRequeueOnError=function(a){this.settings.requeue_on_error=a;this.callFlash(\"SetRequeueOnError\",[a])};SWFUpload.prototype.setHTTPSuccess=function(a){if(typeof a===\"string\"){a=a.replace(\" \",\"\").split(\",\")}this.settings.http_success=a;this.callFlash(\"SetHTTPSuccess\",[a])};SWFUpload.prototype.setAssumeSuccessTimeout=function(a){this.settings.assume_success_timeout=a;this.callFlash(\"SetAssumeSuccessTimeout\",[a])};SWFUpload.prototype.setDebugEnabled=function(a){this.settings.debug_enabled=a;this.callFlash(\"SetDebugEnabled\",[a])};SWFUpload.prototype.setButtonImageURL=function(a){if(a==undefined){a=\"\"}this.settings.button_image_url=a;this.callFlash(\"SetButtonImageURL\",[a])};SWFUpload.prototype.setButtonDimensions=function(c,a){this.settings.button_width=c;this.settings.button_height=a;var b=this.getMovieElement();if(b!=undefined){b.style.width=c+\"px\";b.style.height=a+\"px\"}this.callFlash(\"SetButtonDimensions\",[c,a])};SWFUpload.prototype.setButtonText=function(a){this.settings.button_text=a;this.callFlash(\"SetButtonText\",[a])};SWFUpload.prototype.setButtonTextPadding=function(b,a){this.settings.button_text_top_padding=a;this.settings.button_text_left_padding=b;this.callFlash(\"SetButtonTextPadding\",[b,a])};SWFUpload.prototype.setButtonTextStyle=function(a){this.settings.button_text_style=a;this.callFlash(\"SetButtonTextStyle\",[a])};SWFUpload.prototype.setButtonDisabled=function(a){this.settings.button_disabled=a;this.callFlash(\"SetButtonDisabled\",[a])};SWFUpload.prototype.setButtonAction=function(a){this.settings.button_action=a;this.callFlash(\"SetButtonAction\",[a])};SWFUpload.prototype.setButtonCursor=function(a){this.settings.button_cursor=a;this.callFlash(\"SetButtonCursor\",[a])};SWFUpload.prototype.queueEvent=function(b,c){if(c==undefined){c=[]}else{if(!(c instanceof Array)){c=[c]}}var a=this;if(typeof this.settings[b]===\"function\"){this.eventQueue.push(function(){this.settings[b].apply(this,c)});setTimeout(function(){a.executeNextEvent()},0)}else{if(this.settings[b]!==null){throw\"Event handler \"+b+\" is unknown or is not a function\"}}};SWFUpload.prototype.executeNextEvent=function(){var a=this.eventQueue?this.eventQueue.shift():null;if(typeof(a)===\"function\"){a.apply(this)}};SWFUpload.prototype.unescapeFilePostParams=function(c){var e=/[$]([0-9a-f]{4})/i;var f={};var d;if(c!=undefined){for(var a in c.post){if(c.post.hasOwnProperty(a)){d=a;var b;while((b=e.exec(d))!==null){d=d.replace(b[0],String.fromCharCode(parseInt(\"0x\"+b[1],16)))}f[d]=c.post[a]}}c.post=f}return c};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash(\"TestExternalInterface\")}catch(a){return false}};SWFUpload.prototype.flashReady=function(){var a=this.getMovieElement();if(!a){this.debug(\"Flash called back ready but the flash movie can't be found.\");return}this.cleanUp(a);this.queueEvent(\"swfupload_loaded_handler\")};SWFUpload.prototype.cleanUp=function(a){try{if(this.movieElement&&typeof(a.CallFunction)===\"unknown\"){this.debug(\"Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)\");for(var c in a){try{if(typeof(a[c])===\"function\"){a[c]=null}}catch(b){}}}}catch(d){}window.__flash__removeCallback=function(e,f){try{if(e){e[f]=null}}catch(g){}}};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent(\"file_dialog_start_handler\")};SWFUpload.prototype.fileQueued=function(a){a=this.unescapeFilePostParams(a);this.queueEvent(\"file_queued_handler\",a)};SWFUpload.prototype.fileQueueError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent(\"file_queue_error_handler\",[a,c,b])};SWFUpload.prototype.fileDialogComplete=function(b,c,a){this.queueEvent(\"file_dialog_complete_handler\",[b,c,a])};SWFUpload.prototype.uploadStart=function(a){a=this.unescapeFilePostParams(a);this.queueEvent(\"return_upload_start_handler\",a)};SWFUpload.prototype.returnUploadStart=function(a){var b;if(typeof this.settings.upload_start_handler===\"function\"){a=this.unescapeFilePostParams(a);b=this.settings.upload_start_handler.call(this,a)}else{if(this.settings.upload_start_handler!=undefined){throw\"upload_start_handler must be a function\"}}if(b===undefined){b=true}b=!!b;this.callFlash(\"ReturnUploadStart\",[b])};SWFUpload.prototype.uploadProgress=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent(\"upload_progress_handler\",[a,c,b])};SWFUpload.prototype.uploadError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent(\"upload_error_handler\",[a,c,b])};SWFUpload.prototype.uploadSuccess=function(b,a,c){b=this.unescapeFilePostParams(b);this.queueEvent(\"upload_success_handler\",[b,a,c])};SWFUpload.prototype.uploadComplete=function(a){a=this.unescapeFilePostParams(a);this.queueEvent(\"upload_complete_handler\",a)};SWFUpload.prototype.debug=function(a){this.queueEvent(\"debug_handler\",a)};SWFUpload.prototype.debugMessage=function(c){if(this.settings.debug){var a,d=[];if(typeof c===\"object\"&&typeof c.name===\"string\"&&typeof c.message===\"string\"){for(var b in c){if(c.hasOwnProperty(b)){d.push(b+\": \"+c[b])}}a=d.join(\"\\n\")||\"\";d=a.split(\"\\n\");a=\"EXCEPTION: \"+d.join(\"\\nEXCEPTION: \");SWFUpload.Console.writeLine(a)}else{SWFUpload.Console.writeLine(c)}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(d){var b,a;try{b=document.getElementById(\"SWFUpload_Console\");if(!b){a=document.createElement(\"form\");document.getElementsByTagName(\"body\")[0].appendChild(a);b=document.createElement(\"textarea\");b.id=\"SWFUpload_Console\";b.style.fontFamily=\"monospace\";b.setAttribute(\"wrap\",\"off\");b.wrap=\"off\";b.style.overflow=\"auto\";b.style.width=\"700px\";b.style.height=\"350px\";b.style.margin=\"5px\";a.appendChild(b)}b.value+=d+\"\\n\";b.scrollTop=b.scrollHeight-b.clientHeight}catch(c){alert(\"Exception: \"+c.name+\" Message: \"+c.message)}};\n\n/*\nUploadify v3.1.1\nCopyright (c) 2012 Reactive Apps, Ronnie Garcia\nReleased under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\n\n(function($) {\n\n\t// These methods can be called by adding them as the first argument in the uploadify plugin call\n\tvar methods = {\n\n\t\tinit : function(options, swfUploadOptions) {\n\t\t\t\n\t\t\treturn this.each(function() {\n\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this = $(this);\n\n\t\t\t\t// Clone the original DOM object\n\t\t\t\tvar $clone = $this.clone();\n\n\t\t\t\t// Setup the default options\n\t\t\t\tvar settings = $.extend({\n\t\t\t\t\t// Required Settings\n\t\t\t\t\tid       : $this.attr('id'), // The ID of the DOM object\n\t\t\t\t\tswf      : 'uploadify.swf',  // The path to the uploadify SWF file\n\t\t\t\t\tuploader : 'uploadify.php',  // The path to the server-side upload script\n\t\t\t\t\t\n\t\t\t\t\t// Options\n\t\t\t\t\tauto            : true,               // Automatically upload files when added to the queue\n\t\t\t\t\tbuttonClass     : '',                 // A class name to add to the browse button DOM object\n\t\t\t\t\tbuttonCursor    : 'hand',             // The cursor to use with the browse button\n\t\t\t\t\tbuttonImage     : null,               // (String or null) The path to an image to use for the Flash browse button if not using CSS to style the button\n\t\t\t\t\tbuttonText      : 'SELECT FILES',     // The text to use for the browse button\n\t\t\t\t\tcheckExisting   : false,              // The path to a server-side script that checks for existing files on the server\n\t\t\t\t\tdebug           : false,              // Turn on swfUpload debugging mode\n\t\t\t\t\tfileObjName     : 'Filedata',         // The name of the file object to use in your server-side script\n\t\t\t\t\tfileSizeLimit   : 0,                  // The maximum size of an uploadable file in KB (Accepts units B KB MB GB if string, 0 for no limit)\n\t\t\t\t\tfileTypeDesc    : 'All Files',        // The description for file types in the browse dialog\n\t\t\t\t\tfileTypeExts    : '*.*',              // Allowed extensions in the browse dialog (server-side validation should also be used)\n\t\t\t\t\theight          : 30,                 // The height of the browse button\n\t\t\t\t\tmethod          : 'post',             // The method to use when sending files to the server-side upload script\n\t\t\t\t\tmulti           : true,               // Allow multiple file selection in the browse dialog\n\t\t\t\t\tformData        : {},                 // An object with additional data to send to the server-side upload script with every file upload\n\t\t\t\t\tpreventCaching  : true,               // Adds a random value to the Flash URL to prevent caching of it (conflicts with existing parameters)\n\t\t\t\t\tprogressData    : 'percentage',       // ('percentage' or 'speed') Data to show in the queue item during a file upload\n\t\t\t\t\tqueueID         : false,              // The ID of the DOM object to use as a file queue (without the #)\n\t\t\t\t\tqueueSizeLimit  : 999,                // The maximum number of files that can be in the queue at one time\n\t\t\t\t\tremoveCompleted : true,               // Remove queue items from the queue when they are done uploading\n\t\t\t\t\tremoveTimeout   : 3,                  // The delay in seconds before removing a queue item if removeCompleted is set to true\n\t\t\t\t\trequeueErrors   : false,              // Keep errored files in the queue and keep trying to upload them\n\t\t\t\t\tsuccessTimeout  : 30,                 // The number of seconds to wait for Flash to detect the server's response after the file has finished uploading\n\t\t\t\t\tuploadLimit     : 0,                  // The maximum number of files you can upload\n\t\t\t\t\twidth           : 120,                // The width of the browse button\n\t\t\t\t\t\n\t\t\t\t\t// Events\n\t\t\t\t\toverrideEvents   : []             // (Array) A list of default event handlers to skip\n\t\t\t\t\t/*\n\t\t\t\t\tonCancel         // Triggered when a file is cancelled from the queue\n\t\t\t\t\tonClearQueue     // Triggered during the 'clear queue' method\n\t\t\t\t\tonDestroy        // Triggered when the uploadify object is destroyed\n\t\t\t\t\tonDialogClose    // Triggered when the browse dialog is closed\n\t\t\t\t\tonDialogOpen     // Triggered when the browse dialog is opened\n\t\t\t\t\tonDisable        // Triggered when the browse button gets disabled\n\t\t\t\t\tonEnable         // Triggered when the browse button gets enabled\n\t\t\t\t\tonFallback       // Triggered is Flash is not detected    \n\t\t\t\t\tonInit           // Triggered when Uploadify is initialized\n\t\t\t\t\tonQueueComplete  // Triggered when all files in the queue have been uploaded\n\t\t\t\t\tonSelectError    // Triggered when an error occurs while selecting a file (file size, queue size limit, etc.)\n\t\t\t\t\tonSelect         // Triggered for each file that is selected\n\t\t\t\t\tonSWFReady       // Triggered when the SWF button is loaded\n\t\t\t\t\tonUploadComplete // Triggered when a file upload completes (success or error)\n\t\t\t\t\tonUploadError    // Triggered when a file upload returns an error\n\t\t\t\t\tonUploadSuccess  // Triggered when a file is uploaded successfully\n\t\t\t\t\tonUploadProgress // Triggered every time a file progress is updated\n\t\t\t\t\tonUploadStart    // Triggered immediately before a file upload starts\n\t\t\t\t\t*/\n\t\t\t\t}, options);\n\n\t\t\t\t// Prepare settings for SWFUpload\n\t\t\t\tvar swfUploadSettings = {\n\t\t\t\t\tassume_success_timeout   : settings.successTimeout,\n\t\t\t\t\tbutton_placeholder_id    : settings.id,\n\t\t\t\t\tbutton_width             : settings.width,\n\t\t\t\t\tbutton_height            : settings.height,\n\t\t\t\t\tbutton_text              : null,\n\t\t\t\t\tbutton_text_style        : null,\n\t\t\t\t\tbutton_text_top_padding  : 0,\n\t\t\t\t\tbutton_text_left_padding : 0,\n\t\t\t\t\tbutton_action            : (settings.multi ? SWFUpload.BUTTON_ACTION.SELECT_FILES : SWFUpload.BUTTON_ACTION.SELECT_FILE),\n\t\t\t\t\tbutton_disabled          : false,\n\t\t\t\t\tbutton_cursor            : (settings.buttonCursor == 'arrow' ? SWFUpload.CURSOR.ARROW : SWFUpload.CURSOR.HAND),\n\t\t\t\t\tbutton_window_mode       : SWFUpload.WINDOW_MODE.TRANSPARENT,\n\t\t\t\t\tdebug                    : settings.debug,\t\t\t\t\t\t\n\t\t\t\t\trequeue_on_error         : settings.requeueErrors,\n\t\t\t\t\tfile_post_name           : settings.fileObjName,\n\t\t\t\t\tfile_size_limit          : settings.fileSizeLimit,\n\t\t\t\t\tfile_types               : settings.fileTypeExts,\n\t\t\t\t\tfile_types_description   : settings.fileTypeDesc,\n\t\t\t\t\tfile_queue_limit         : settings.queueSizeLimit,\n\t\t\t\t\tfile_upload_limit        : settings.uploadLimit,\n\t\t\t\t\tflash_url                : settings.swf,\t\t\t\t\t\n\t\t\t\t\tprevent_swf_caching      : settings.preventCaching,\n\t\t\t\t\tpost_params              : settings.formData,\n\t\t\t\t\tupload_url               : settings.uploader,\n\t\t\t\t\tuse_query_string         : (settings.method == 'get'),\n\t\t\t\t\t\n\t\t\t\t\t// Event Handlers \n\t\t\t\t\tfile_dialog_complete_handler : handlers.onDialogClose,\n\t\t\t\t\tfile_dialog_start_handler    : handlers.onDialogOpen,\n\t\t\t\t\tfile_queued_handler          : handlers.onSelect,\n\t\t\t\t\tfile_queue_error_handler     : handlers.onSelectError,\n\t\t\t\t\tswfupload_loaded_handler     : settings.onSWFReady,\n\t\t\t\t\tupload_complete_handler      : handlers.onUploadComplete,\n\t\t\t\t\tupload_error_handler         : handlers.onUploadError,\n\t\t\t\t\tupload_progress_handler      : handlers.onUploadProgress,\n\t\t\t\t\tupload_start_handler         : handlers.onUploadStart,\n\t\t\t\t\tupload_success_handler       : handlers.onUploadSuccess\n\t\t\t\t}\n\n\t\t\t\t// Merge the user-defined options with the defaults\n\t\t\t\tif (swfUploadOptions) {\n\t\t\t\t\tswfUploadSettings = $.extend(swfUploadSettings, swfUploadOptions);\n\t\t\t\t}\n\t\t\t\t// Add the user-defined settings to the swfupload object\n\t\t\t\tswfUploadSettings = $.extend(swfUploadSettings, settings);\n\t\t\t\t\n\t\t\t\t// Detect if Flash is available\n\t\t\t\tvar playerVersion  = swfobject.getFlashPlayerVersion();\n\t\t\t\tvar flashInstalled = (playerVersion.major >= 9);\n\n\t\t\t\tif (flashInstalled) {\n\t\t\t\t\t// Create the swfUpload instance\n\t\t\t\t\twindow['uploadify_' + settings.id] = new SWFUpload(swfUploadSettings);\n\t\t\t\t\tvar swfuploadify = window['uploadify_' + settings.id];\n\n\t\t\t\t\t// Add the SWFUpload object to the elements data object\n\t\t\t\t\t$this.data('uploadify', swfuploadify);\n\t\t\t\t\t\n\t\t\t\t\t// Wrap the instance\n\t\t\t\t\tvar $wrapper = $('<div />', {\n\t\t\t\t\t\t'id'    : settings.id,\n\t\t\t\t\t\t'class' : 'uploadify',\n\t\t\t\t\t\t'css'   : {\n\t\t\t\t\t\t\t\t\t'height'   : settings.height + 'px',\n\t\t\t\t\t\t\t\t\t'width'    : settings.width + 'px'\n\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t});\n\t\t\t\t\t$('#' + swfuploadify.movieName).wrap($wrapper);\n\t\t\t\t\t// Recreate the reference to wrapper\n\t\t\t\t\t$wrapper = $('#' + settings.id);\n\t\t\t\t\t// Add the data object to the wrapper \n\t\t\t\t\t$wrapper.data('uploadify', swfuploadify);\n\n\t\t\t\t\t// Create the button\n\t\t\t\t\tvar $button = $('<div />', {\n\t\t\t\t\t\t'id'    : settings.id + '-button',\n\t\t\t\t\t\t'class' : 'uploadify-button ' + settings.buttonClass\n\t\t\t\t\t});\n\t\t\t\t\tif (settings.buttonImage) {\n\t\t\t\t\t\t$button.css({\n\t\t\t\t\t\t\t'background-image' : \"url('\" + settings.buttonImage + \"')\",\n\t\t\t\t\t\t\t'text-indent'      : '-9999px'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$button.html('<span class=\"uploadify-button-text\">' + settings.buttonText + '</span>')\n\t\t\t\t\t.css({\n\t\t\t\t\t\t'height'      : settings.height + 'px',\n\t\t\t\t\t\t'line-height' : settings.height + 'px',\n\t\t\t\t\t\t'width'       : settings.width + 'px'\n\t\t\t\t\t});\n\t\t\t\t\t// Append the button to the wrapper\n\t\t\t\t\t$wrapper.append($button);\n\n\t\t\t\t\t// Adjust the styles of the movie\n\t\t\t\t\t$('#' + swfuploadify.movieName).css({\n\t\t\t\t\t\t'position' : 'absolute',\n\t\t\t\t\t\t'z-index'  : 1\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t// Create the file queue\n\t\t\t\t\tif (!settings.queueID) {\n\t\t\t\t\t\tvar $queue = $('<div />', {\n\t\t\t\t\t\t\t'id'    : settings.id + '-queue',\n\t\t\t\t\t\t\t'class' : 'uploadify-queue'\n\t\t\t\t\t\t});\n\t\t\t\t\t\t$wrapper.after($queue);\n\t\t\t\t\t\tswfuploadify.settings.queueID      = settings.id + '-queue';\n\t\t\t\t\t\tswfuploadify.settings.defaultQueue = true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Create some queue related objects and variables\n\t\t\t\t\tswfuploadify.queueData = {\n\t\t\t\t\t\tfiles              : {}, // The files in the queue\n\t\t\t\t\t\tfilesSelected      : 0, // The number of files selected in the last select operation\n\t\t\t\t\t\tfilesQueued        : 0, // The number of files added to the queue in the last select operation\n\t\t\t\t\t\tfilesReplaced      : 0, // The number of files replaced in the last select operation\n\t\t\t\t\t\tfilesCancelled     : 0, // The number of files that were cancelled instead of replaced\n\t\t\t\t\t\tfilesErrored       : 0, // The number of files that caused error in the last select operation\n\t\t\t\t\t\tuploadsSuccessful  : 0, // The number of files that were successfully uploaded\n\t\t\t\t\t\tuploadsErrored     : 0, // The number of files that returned errors during upload\n\t\t\t\t\t\taverageSpeed       : 0, // The average speed of the uploads in KB\n\t\t\t\t\t\tqueueLength        : 0, // The number of files in the queue\n\t\t\t\t\t\tqueueSize          : 0, // The size in bytes of the entire queue\n\t\t\t\t\t\tuploadSize         : 0, // The size in bytes of the upload queue\n\t\t\t\t\t\tqueueBytesUploaded : 0, // The size in bytes that have been uploaded for the current upload queue\n\t\t\t\t\t\tuploadQueue        : [], // The files currently to be uploaded\n\t\t\t\t\t\terrorMsg           : 'Some files were not added to the queue:'\n\t\t\t\t\t};\n\n\t\t\t\t\t// Save references to all the objects\n\t\t\t\t\tswfuploadify.original = $clone;\n\t\t\t\t\tswfuploadify.wrapper  = $wrapper;\n\t\t\t\t\tswfuploadify.button   = $button;\n\t\t\t\t\tswfuploadify.queue    = $queue;\n\n\t\t\t\t\t// Call the user-defined init event handler\n\t\t\t\t\tif (settings.onInit) settings.onInit.call($this, swfuploadify);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Call the fallback function\n\t\t\t\t\tif (settings.onFallback) settings.onFallback.call($this);\n\n\t\t\t\t}\n\t\t\t});\n\n\t\t},\n\n\t\t// Stop a file upload and remove it from the queue \n\t\tcancel : function(fileID, supressEvent) {\n\n\t\t\tvar args = arguments;\n\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify'),\n\t\t\t\t\tsettings     = swfuploadify.settings,\n\t\t\t\t\tdelay        = -1;\n\n\t\t\t\tif (args[0]) {\n\t\t\t\t\t// Clear the queue\n\t\t\t\t\tif (args[0] == '*') {\n\t\t\t\t\t\tvar queueItemCount = swfuploadify.queueData.queueLength;\n\t\t\t\t\t\t$('#' + settings.queueID).find('.uploadify-queue-item').each(function() {\n\t\t\t\t\t\t\tdelay++;\n\t\t\t\t\t\t\tif (args[1] === true) {\n\t\t\t\t\t\t\t\tswfuploadify.cancelUpload($(this).attr('id'), false);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswfuploadify.cancelUpload($(this).attr('id'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$(this).find('.data').removeClass('data').html(' - Cancelled');\n\t\t\t\t\t\t\t$(this).find('.uploadify-progress-bar').remove();\n\t\t\t\t\t\t\t$(this).delay(1000 + 100 * delay).fadeOut(500, function() {\n\t\t\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tswfuploadify.queueData.queueSize   = 0;\n\t\t\t\t\t\tswfuploadify.queueData.queueLength = 0;\n\t\t\t\t\t\t// Trigger the onClearQueue event\n\t\t\t\t\t\tif (settings.onClearQueue) settings.onClearQueue.call($this, queueItemCount);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var n = 0; n < args.length; n++) {\n\t\t\t\t\t\t\tswfuploadify.cancelUpload(args[n]);\n\t\t\t\t\t\t\t$('#' + args[n]).find('.data').removeClass('data').html(' - Cancelled');\n\t\t\t\t\t\t\t$('#' + args[n]).find('.uploadify-progress-bar').remove();\n\t\t\t\t\t\t\t$('#' + args[n]).delay(1000 + 100 * n).fadeOut(500, function() {\n\t\t\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar item = $('#' + settings.queueID).find('.uploadify-queue-item').get(0);\n\t\t\t\t\t$item = $(item);\n\t\t\t\t\tswfuploadify.cancelUpload($item.attr('id'));\n\t\t\t\t\t$item.find('.data').removeClass('data').html(' - Cancelled');\n\t\t\t\t\t$item.find('.uploadify-progress-bar').remove();\n\t\t\t\t\t$item.delay(1000).fadeOut(500, function() {\n\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t},\n\n\t\t// Revert the DOM object back to its original state\n\t\tdestroy : function() {\n\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify'),\n\t\t\t\t\tsettings     = swfuploadify.settings;\n\n\t\t\t\t// Destroy the SWF object and \n\t\t\t\tswfuploadify.destroy();\n\t\t\t\t\n\t\t\t\t// Destroy the queue\n\t\t\t\tif (settings.defaultQueue) {\n\t\t\t\t\t$('#' + settings.queueID).remove();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Reload the original DOM element\n\t\t\t\t$('#' + settings.id).replaceWith(swfuploadify.original);\n\n\t\t\t\t// Call the user-defined event handler\n\t\t\t\tif (settings.onDestroy) settings.onDestroy.call(this);\n\n\t\t\t\tdelete swfuploadify;\n\t\t\t});\n\n\t\t},\n\n\t\t// Disable the select button\n\t\tdisable : function(isDisabled) {\n\t\t\t\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify'),\n\t\t\t\t\tsettings     = swfuploadify.settings;\n\n\t\t\t\t// Call the user-defined event handlers\n\t\t\t\tif (isDisabled) {\n\t\t\t\t\tswfuploadify.button.addClass('disabled');\n\t\t\t\t\tif (settings.onDisable) settings.onDisable.call(this);\n\t\t\t\t} else {\n\t\t\t\t\tswfuploadify.button.removeClass('disabled');\n\t\t\t\t\tif (settings.onEnable) settings.onEnable.call(this);\n\t\t\t\t}\n\n\t\t\t\t// Enable/disable the browse button\n\t\t\t\tswfuploadify.setButtonDisabled(isDisabled);\n\t\t\t});\n\n\t\t},\n\n\t\t// Get or set the settings data\n\t\tsettings : function(name, value, resetObjects) {\n\n\t\t\tvar args        = arguments;\n\t\t\tvar returnValue = value;\n\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify'),\n\t\t\t\t\tsettings     = swfuploadify.settings;\n\n\t\t\t\tif (typeof(args[0]) == 'object') {\n\t\t\t\t\tfor (var n in value) {\n\t\t\t\t\t\tsetData(n,value[n]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (args.length === 1) {\n\t\t\t\t\treturnValue =  settings[name];\n\t\t\t\t} else {\n\t\t\t\t\tswitch (name) {\n\t\t\t\t\t\tcase 'uploader':\n\t\t\t\t\t\t\tswfuploadify.setUploadURL(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'formData':\n\t\t\t\t\t\t\tif (!resetObjects) {\n\t\t\t\t\t\t\t\tvalue = $.extend(settings.formData, value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswfuploadify.setPostParams(settings.formData);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'method':\n\t\t\t\t\t\t\tif (value == 'get') {\n\t\t\t\t\t\t\t\tswfuploadify.setUseQueryString(true);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswfuploadify.setUseQueryString(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'fileObjName':\n\t\t\t\t\t\t\tswfuploadify.setFilePostName(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'fileTypeExts':\n\t\t\t\t\t\t\tswfuploadify.setFileTypes(value, settings.fileTypeDesc);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'fileTypeDesc':\n\t\t\t\t\t\t\tswfuploadify.setFileTypes(settings.fileTypeExts, value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'fileSizeLimit':\n\t\t\t\t\t\t\tswfuploadify.setFileSizeLimit(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'uploadLimit':\n\t\t\t\t\t\t\tswfuploadify.setFileUploadLimit(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'queueSizeLimit':\n\t\t\t\t\t\t\tswfuploadify.setFileQueueLimit(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'buttonImage':\n\t\t\t\t\t\t\tswfuploadify.button.css('background-image', settingValue);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'buttonCursor':\n\t\t\t\t\t\t\tif (value == 'arrow') {\n\t\t\t\t\t\t\t\tswfuploadify.setButtonCursor(SWFUpload.CURSOR.ARROW);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswfuploadify.setButtonCursor(SWFUpload.CURSOR.HAND);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'buttonText':\n\t\t\t\t\t\t\t$('#' + settings.id + '-button').find('.uploadify-button-text').html(value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'width':\n\t\t\t\t\t\t\tswfuploadify.setButtonDimensions(value, settings.height);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'height':\n\t\t\t\t\t\t\tswfuploadify.setButtonDimensions(settings.width, value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'multi':\n\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\tswfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tswfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tsettings[name] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif (args.length === 1) {\n\t\t\t\treturn returnValue;\n\t\t\t}\n\n\t\t},\n\n\t\t// Stop the current uploads and requeue what is in progress\n\t\tstop : function() {\n\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify');\n\n\t\t\t\t// Reset the queue information\n\t\t\t\tswfuploadify.queueData.averageSpeed  = 0;\n\t\t\t\tswfuploadify.queueData.uploadSize    = 0;\n\t\t\t\tswfuploadify.queueData.bytesUploaded = 0;\n\t\t\t\tswfuploadify.queueData.uploadQueue   = [];\n\n\t\t\t\tswfuploadify.stopUpload();\n\t\t\t});\n\n\t\t},\n\n\t\t// Start uploading files in the queue\n\t\tupload : function() {\n\n\t\t\tvar args = arguments;\n\n\t\t\tthis.each(function() {\n\t\t\t\t// Create a reference to the jQuery DOM object\n\t\t\t\tvar $this        = $(this),\n\t\t\t\t\tswfuploadify = $this.data('uploadify');\n\n\t\t\t\t// Reset the queue information\n\t\t\t\tswfuploadify.queueData.averageSpeed  = 0;\n\t\t\t\tswfuploadify.queueData.uploadSize    = 0;\n\t\t\t\tswfuploadify.queueData.bytesUploaded = 0;\n\t\t\t\tswfuploadify.queueData.uploadQueue   = [];\n\t\t\t\t\n\t\t\t\t// Upload the files\n\t\t\t\tif (args[0]) {\n\t\t\t\t\tif (args[0] == '*') {\n\t\t\t\t\t\tswfuploadify.queueData.uploadSize = swfuploadify.queueData.queueSize;\n\t\t\t\t\t\tswfuploadify.queueData.uploadQueue.push('*');\n\t\t\t\t\t\tswfuploadify.startUpload();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var n = 0; n < args.length; n++) {\n\t\t\t\t\t\t\tswfuploadify.queueData.uploadSize += swfuploadify.queueData.files[args[n]].size;\n\t\t\t\t\t\t\tswfuploadify.queueData.uploadQueue.push(args[n]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswfuploadify.startUpload(swfuploadify.queueData.uploadQueue.shift());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswfuploadify.startUpload();\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t// These functions handle all the events that occur with the file uploader\n\tvar handlers = {\n\n\t\t// Triggered when the file dialog is opened\n\t\tonDialogOpen : function() {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Reset some queue info\n\t\t\tthis.queueData.errorMsg       = 'Some files were not added to the queue:';\n\t\t\tthis.queueData.filesReplaced  = 0;\n\t\t\tthis.queueData.filesCancelled = 0;\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onDialogOpen) settings.onDialogOpen.call(this);\n\t\t},\n\n\t\t// Triggered when the browse dialog is closed\n\t\tonDialogClose :  function(filesSelected, filesQueued, queueLength) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Update the queue information\n\t\t\tthis.queueData.filesErrored  = filesSelected - filesQueued;\n\t\t\tthis.queueData.filesSelected = filesSelected;\n\t\t\tthis.queueData.filesQueued   = filesQueued - this.queueData.filesCancelled;\n\t\t\tthis.queueData.queueLength   = queueLength;\n\n\t\t\t// Run the default event handler\n\t\t\tif ($.inArray('onDialogClose', settings.overrideEvents) < 0) {\n\t\t\t\tif (this.queueData.filesErrored > 0) {\n\t\t\t\t\talert(this.queueData.errorMsg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onDialogClose) settings.onDialogClose.call(this, this.queueData);\n\n\t\t\t// Upload the files if auto is true\n\t\t\tif (settings.auto) $('#' + settings.id).uploadify('upload', '*');\n\t\t},\n\n\t\t// Triggered once for each file added to the queue\n\t\tonSelect : function(file) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Check if a file with the same name exists in the queue\n\t\t\tvar queuedFile = {};\n\t\t\tfor (var n in this.queueData.files) {\n\t\t\t\tqueuedFile = this.queueData.files[n];\n\t\t\t\tif (queuedFile.uploaded != true && queuedFile.name == file.name) {\n\t\t\t\t\tvar replaceQueueItem = confirm('The file named \"' + file.name + '\" is already in the queue.\\nDo you want to replace the existing item in the queue?');\n\t\t\t\t\tif (!replaceQueueItem) {\n\t\t\t\t\t\tthis.cancelUpload(file.id);\n\t\t\t\t\t\tthis.queueData.filesCancelled++;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$('#' + queuedFile.id).remove();\n\t\t\t\t\t\tthis.cancelUpload(queuedFile.id);\n\t\t\t\t\t\tthis.queueData.filesReplaced++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get the size of the file\n\t\t\tvar fileSize = Math.round(file.size / 1024);\n\t\t\tvar suffix   = 'KB';\n\t\t\tif (fileSize > 1000) {\n\t\t\t\tfileSize = Math.round(fileSize / 1000);\n\t\t\t\tsuffix   = 'MB';\n\t\t\t}\n\t\t\tvar fileSizeParts = fileSize.toString().split('.');\n\t\t\tfileSize = fileSizeParts[0];\n\t\t\tif (fileSizeParts.length > 1) {\n\t\t\t\tfileSize += '.' + fileSizeParts[1].substr(0,2);\n\t\t\t}\n\t\t\tfileSize += suffix;\n\t\t\t\n\t\t\t// Truncate the filename if it's too long\n\t\t\tvar fileName = file.name;\n\t\t\tif (fileName.length > 25) {\n\t\t\t\tfileName = fileName.substr(0,25) + '...';\n\t\t\t}\n\n\t\t\t// Run the default event handler\n\t\t\tif ($.inArray('onSelect', settings.overrideEvents) < 0) {\n\t\t\t\t\n\t\t\t\t// Add the file item to the queue\n\t\t\t\t$('#' + settings.queueID).append('<div id=\"' + file.id + '\" class=\"uploadify-queue-item\">\\\n\t\t\t\t\t<div class=\"cancel\">\\\n\t\t\t\t\t\t<a href=\"javascript:$(\\'#' + settings.id + '\\').uploadify(\\'cancel\\', \\'' + file.id + '\\')\">X</a>\\\n\t\t\t\t\t</div>\\\n\t\t\t\t\t<span class=\"fileName\">' + fileName + ' (' + fileSize + ')</span><span class=\"data\"></span>\\\n\t\t\t\t\t<div class=\"uploadify-progress\">\\\n\t\t\t\t\t\t<div class=\"uploadify-progress-bar\"><!--Progress Bar--></div>\\\n\t\t\t\t\t</div>\\\n\t\t\t\t</div>');\n\t\t\t\t\n\t\t\t}\n\n\t\t\tthis.queueData.queueSize += file.size;\n\t\t\tthis.queueData.files[file.id] = file;\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onSelect) settings.onSelect.apply(this, arguments);\n\t\t},\n\n\t\t// Triggered when a file is not added to the queue\n\t\tonSelectError : function(file, errorCode, errorMsg) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Run the default event handler\n\t\t\tif ($.inArray('onSelectError', settings.overrideEvents) < 0) {\n\t\t\t\tswitch(errorCode) {\n\t\t\t\t\tcase SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:\n\t\t\t\t\t\tif (settings.queueSizeLimit > errorMsg) {\n\t\t\t\t\t\t\tthis.queueData.errorMsg += '\\nThe number of files selected exceeds the remaining upload limit (' + errorMsg + ').';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.queueData.errorMsg += '\\nThe number of files selected exceeds the queue size limit (' + settings.queueSizeLimit + ').';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:\n\t\t\t\t\t\tthis.queueData.errorMsg += '\\nThe file \"' + file.name + '\" exceeds the size limit (' + settings.fileSizeLimit + ').';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:\n\t\t\t\t\t\tthis.queueData.errorMsg += '\\nThe file \"' + file.name + '\" is empty.';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:\n\t\t\t\t\t\tthis.queueData.errorMsg += '\\nThe file \"' + file.name + '\" is not an accepted file type (' + settings.fileTypeDesc + ').';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (errorCode != SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {\n\t\t\t\tdelete this.queueData.files[file.id];\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onSelectError) settings.onSelectError.apply(this, arguments);\n\t\t},\n\n\t\t// Triggered when all the files in the queue have been processed\n\t\tonQueueComplete : function() {\n\t\t\tif (this.settings.onQueueComplete) this.settings.onQueueComplete.call(this, this.settings.queueData);\n\t\t},\n\n\t\t// Triggered when a file upload successfully completes\n\t\tonUploadComplete : function(file) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings     = this.settings,\n\t\t\t\tswfuploadify = this;\n\n\t\t\t// Check if all the files have completed uploading\n\t\t\tvar stats = this.getStats();\n\t\t\tthis.queueData.queueLength = stats.files_queued;\n\t\t\tif (this.queueData.uploadQueue[0] == '*') {\n\t\t\t\tif (this.queueData.queueLength > 0) {\n\t\t\t\t\tthis.startUpload();\n\t\t\t\t} else {\n\t\t\t\t\tthis.queueData.uploadQueue = [];\n\n\t\t\t\t\t// Call the user-defined event handler for queue complete\n\t\t\t\t\tif (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.queueData.uploadQueue.length > 0) {\n\t\t\t\t\tthis.startUpload(this.queueData.uploadQueue.shift());\n\t\t\t\t} else {\n\t\t\t\t\tthis.queueData.uploadQueue = [];\n\n\t\t\t\t\t// Call the user-defined event handler for queue complete\n\t\t\t\t\tif (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the default event handler\n\t\t\tif ($.inArray('onUploadComplete', settings.overrideEvents) < 0) {\n\t\t\t\tif (settings.removeCompleted) {\n\t\t\t\t\tswitch (file.filestatus) {\n\t\t\t\t\t\tcase SWFUpload.FILE_STATUS.COMPLETE:\n\t\t\t\t\t\t\tsetTimeout(function() { \n\t\t\t\t\t\t\t\tif ($('#' + file.id)) {\n\t\t\t\t\t\t\t\t\tswfuploadify.queueData.queueSize   -= file.size;\n\t\t\t\t\t\t\t\t\tswfuploadify.queueData.queueLength -= 1;\n\t\t\t\t\t\t\t\t\tdelete swfuploadify.queueData.files[file.id]\n\t\t\t\t\t\t\t\t\t$('#' + file.id).fadeOut(500, function() {\n\t\t\t\t\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, settings.removeTimeout * 1000);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SWFUpload.FILE_STATUS.ERROR:\n\t\t\t\t\t\t\tif (!settings.requeueErrors) {\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tif ($('#' + file.id)) {\n\t\t\t\t\t\t\t\t\t\tswfuploadify.queueData.queueSize   -= file.size;\n\t\t\t\t\t\t\t\t\t\tswfuploadify.queueData.queueLength -= 1;\n\t\t\t\t\t\t\t\t\t\tdelete swfuploadify.queueData.files[file.id];\n\t\t\t\t\t\t\t\t\t\t$('#' + file.id).fadeOut(500, function() {\n\t\t\t\t\t\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, settings.removeTimeout * 1000);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfile.uploaded = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onUploadComplete) settings.onUploadComplete.call(this, file);\n\t\t},\n\n\t\t// Triggered when a file upload returns an error\n\t\tonUploadError : function(file, errorCode, errorMsg) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Set the error string\n\t\t\tvar errorString = 'Error';\n\t\t\tswitch(errorCode) {\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.HTTP_ERROR:\n\t\t\t\t\terrorString = 'HTTP Error (' + errorMsg + ')';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:\n\t\t\t\t\terrorString = 'Missing Upload URL';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.IO_ERROR:\n\t\t\t\t\terrorString = 'IO Error';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:\n\t\t\t\t\terrorString = 'Security Error';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:\n\t\t\t\t\talert('The upload limit has been reached (' + errorMsg + ').');\n\t\t\t\t\terrorString = 'Exceeds Upload Limit';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:\n\t\t\t\t\terrorString = 'Failed';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:\n\t\t\t\t\terrorString = 'Validation Error';\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:\n\t\t\t\t\terrorString = 'Cancelled';\n\t\t\t\t\tthis.queueData.queueSize   -= file.size;\n\t\t\t\t\tthis.queueData.queueLength -= 1;\n\t\t\t\t\tif (file.status == SWFUpload.FILE_STATUS.IN_PROGRESS || $.inArray(file.id, this.queueData.uploadQueue) >= 0) {\n\t\t\t\t\t\tthis.queueData.uploadSize -= file.size;\n\t\t\t\t\t}\n\t\t\t\t\t// Trigger the onCancel event\n\t\t\t\t\tif (settings.onCancel) settings.onCancel.call(this, file);\n\t\t\t\t\tdelete this.queueData.files[file.id];\n\t\t\t\t\tbreak;\n\t\t\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:\n\t\t\t\t\terrorString = 'Stopped';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Call the default event handler\n\t\t\tif ($.inArray('onUploadError', settings.overrideEvents) < 0) {\n\n\t\t\t\tif (errorCode != SWFUpload.UPLOAD_ERROR.FILE_CANCELLED && errorCode != SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED) {\n\t\t\t\t\t$('#' + file.id).addClass('uploadify-error');\n\t\t\t\t}\n\n\t\t\t\t// Reset the progress bar\n\t\t\t\t$('#' + file.id).find('.uploadify-progress-bar').css('width','1px');\n\n\t\t\t\t// Add the error message to the queue item\n\t\t\t\tif (errorCode != SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND && file.status != SWFUpload.FILE_STATUS.COMPLETE) {\n\t\t\t\t\t$('#' + file.id).find('.data').html(' - ' + errorString);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar stats = this.getStats();\n\t\t\tthis.queueData.uploadsErrored = stats.upload_errors;\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onUploadError) settings.onUploadError.call(this, file, errorCode, errorMsg, errorString);\n\t\t},\n\n\t\t// Triggered periodically during a file upload\n\t\tonUploadProgress : function(file, fileBytesLoaded, fileTotalBytes) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\t// Setup all the variables\n\t\t\tvar timer            = new Date();\n\t\t\tvar newTime          = timer.getTime();\n\t\t\tvar lapsedTime       = newTime - this.timer;\n\t\t\tif (lapsedTime > 500) {\n\t\t\t\tthis.timer = newTime;\n\t\t\t}\n\t\t\tvar lapsedBytes      = fileBytesLoaded - this.bytesLoaded;\n\t\t\tthis.bytesLoaded     = fileBytesLoaded;\n\t\t\tvar queueBytesLoaded = this.queueData.queueBytesUploaded + fileBytesLoaded;\n\t\t\tvar percentage       = Math.round(fileBytesLoaded / fileTotalBytes * 100);\n\t\t\t\n\t\t\t// Calculate the average speed\n\t\t\tvar suffix = 'KB/s';\n\t\t\tvar mbs = 0;\n\t\t\tvar kbs = (lapsedBytes / 1024) / (lapsedTime / 1000);\n\t\t\t    kbs = Math.floor(kbs * 10) / 10;\n\t\t\tif (this.queueData.averageSpeed > 0) {\n\t\t\t\tthis.queueData.averageSpeed = Math.floor((this.queueData.averageSpeed + kbs) / 2);\n\t\t\t} else {\n\t\t\t\tthis.queueData.averageSpeed = Math.floor(kbs);\n\t\t\t}\n\t\t\tif (kbs > 1000) {\n\t\t\t\tmbs = (kbs * .001);\n\t\t\t\tthis.queueData.averageSpeed = Math.floor(mbs);\n\t\t\t\tsuffix = 'MB/s';\n\t\t\t}\n\t\t\t\n\t\t\t// Call the default event handler\n\t\t\tif ($.inArray('onUploadProgress', settings.overrideEvents) < 0) {\n\t\t\t\tif (settings.progressData == 'percentage') {\n\t\t\t\t\t$('#' + file.id).find('.data').html(' - ' + percentage + '%');\n\t\t\t\t} else if (settings.progressData == 'speed' && lapsedTime > 500) {\n\t\t\t\t\t$('#' + file.id).find('.data').html(' - ' + this.queueData.averageSpeed + suffix);\n\t\t\t\t}\n\t\t\t\t$('#' + file.id).find('.uploadify-progress-bar').css('width', percentage + '%');\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onUploadProgress) settings.onUploadProgress.call(this, file, fileBytesLoaded, fileTotalBytes, queueBytesLoaded, this.queueData.uploadSize);\n\t\t},\n\n\t\t// Triggered right before a file is uploaded\n\t\tonUploadStart : function(file) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\n\t\t\tvar timer        = new Date();\n\t\t\tthis.timer       = timer.getTime();\n\t\t\tthis.bytesLoaded = 0;\n\t\t\tif (this.queueData.uploadQueue.length == 0) {\n\t\t\t\tthis.queueData.uploadSize = file.size;\n\t\t\t}\n\t\t\tif (settings.checkExisting) {\n\t\t\t\t$.ajax({\n\t\t\t\t\ttype    : 'POST',\n\t\t\t\t\tasync   : false,\n\t\t\t\t\turl     : settings.checkExisting,\n\t\t\t\t\tdata    : {filename: file.name},\n\t\t\t\t\tsuccess : function(data) {\n\t\t\t\t\t\tif (data == 1) {\n\t\t\t\t\t\t\tvar overwrite = confirm('A file with the name \"' + file.name + '\" already exists on the server.\\nWould you like to replace the existing file?');\n\t\t\t\t\t\t\tif (!overwrite) {\n\t\t\t\t\t\t\t\tthis.cancelUpload(file.id);\n\t\t\t\t\t\t\t\t$('#' + file.id).remove();\n\t\t\t\t\t\t\t\tif (this.queueData.uploadQueue.length > 0 && this.queueData.queueLength > 0) {\n\t\t\t\t\t\t\t\t\tif (this.queueData.uploadQueue[0] == '*') {\n\t\t\t\t\t\t\t\t\t\tthis.startUpload();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.startUpload(this.queueData.uploadQueue.shift());\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onUploadStart) settings.onUploadStart.call(this, file); \n\t\t},\n\n\t\t// Triggered when a file upload returns a successful code\n\t\tonUploadSuccess : function(file, data, response) {\n\t\t\t// Load the swfupload settings\n\t\t\tvar settings = this.settings;\n\t\t\tvar stats    = this.getStats();\n\t\t\tthis.queueData.uploadsSuccessful = stats.successful_uploads;\n\t\t\tthis.queueData.queueBytesUploaded += file.size;\n\n\t\t\t// Call the default event handler\n\t\t\tif ($.inArray('onUploadSuccess', settings.overrideEvents) < 0) {\n\t\t\t\t$('#' + file.id).find('.data').html(' - Complete');\n\t\t\t}\n\n\t\t\t// Call the user-defined event handler\n\t\t\tif (settings.onUploadSuccess) settings.onUploadSuccess.call(this, file, data, response); \n\t\t}\n\n\t}\n\n\t$.fn.uploadify = function(method) {\n\n\t\tif (methods[method]) {\n\t\t\treturn methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t} else if (typeof method === 'object' || !method) {\n\t\t\treturn methods.init.apply(this, arguments);\n\t\t} else {\n\t\t\t$.error('The method ' + method + ' does not exist in $.uploadify');\n\t\t}\n\n\t}\n\n})($);"
  }
]